求指教,输入一个食物名称,按序显示,最后显示部分弄不好。
/* 习题要求创建一个餐馆结构,对于给定食物,要按最小花费显示出所有餐馆*/#include <stdio.h>
#include <malloc.h>
typedef struct uct_food //食物结构体,用来创建餐馆内食物链表
{
char food_name; //食物名称
int food_price; //食物价格
struct uct_food * next; //链表尾节点指针
} FOOD;
typedef struct uct_eatery//餐馆结构体 ,用来创建餐馆链表
{
char eatery_name; //餐馆名称
char eatery_address; //餐馆地址
FOOD * food_head; //食物链表头指针
struct eatery * next; //链表尾节点指针
}EATERY;
typedef EATERY eatery;//自定义
eatery * input(); //函数声明
void print(eatery * p, char * c); //函数声明
void main()
{
eatery * head; //餐馆指针
char f; //存放查找的食物名称
printf("****************\n"
"* 商铺管理系统 *\n"
"****************\n");
head = input();//输入餐馆信息,返回头指针
scanf("%s", f);//输入查找食物
fflush(stdin); //清空缓冲区
print(head, f);
#if(0) //测试部分,可忽略
while(head != NULL)
{
printf("%s餐馆,地址%s,", head->eatery_name, head->eatery_address);
while(head->food_head != NULL)
{
printf("食物%s,价格%d, ", head->food_head->food_name, head->food_head->food_price);
head->food_head = head->food_head->next;
}
printf("\n");
head = head->next;
}
#endif
}
eatery * input()
{
eatery * p_food, * p_food_1, *p_food_head;//餐馆指针
FOOD * p, *p1; //食物指针
char temp; //临时字符数组
int count = 0, food_count;//餐馆计数器清零,食物计数器待用
int a;
do
{
if((p_food = malloc(sizeof(eatery))) == NULL)//分配链表空间
printf("%d号空间分配失败", count);
if(count == 0)
p_food_head = p_food_1 = p_food;//判断是否是头结点
else
{
p_food_1->next = p_food; //不是头结点则连接餐馆链表
p_food_1 = p_food;
}
printf("%d号餐馆名称:\n", count++); //取值部分
gets(temp);
strcpy(p_food->eatery_name, temp);
#if(1)
printf("%s餐馆地址:\n", p_food->eatery_name);
gets(temp);
strcpy(p_food->eatery_address, temp);
#endif
food_count = 0; //食物计数器清零
do //偷懒了,应该建立调用函数的%>_<%
{
if((p = malloc(sizeof(FOOD))) == NULL) //分配结点空间
printf("%d号空间分配失败", count);
if(food_count ==0) //判断是否是头结点
p_food->food_head = p1 = p;
else //不是头结点则连接食物链表
{
p1->next = p;
p1 = p;
}
printf("%s餐馆No.%d食物名称:\n", p_food->eatery_name, food_count++);//取值部分
gets(temp);
strcpy(p->food_name, temp);
printf("价格:\n");
gets(temp);
p->food_price = atoi(temp);
printf("食物输入完毕请按0, 继续输入请按任意键\n");//询问食物部分是否继续录入
scanf("%d", &a);
fflush(stdin); //清空缓冲区
if(a == 0) //结束录入则next指向NULL
{
p1->next = NULL;
}
}while(a);//a为0则结束循环
printf("餐馆输入完毕请按0, 继续输入请按任意键\n");//询问餐馆部分是否继续录入
scanf("%d", &a);
fflush(stdin);
if(a == 0)
{
p_food_1->next = NULL;
}
}while(a);
return (p_food_head);//返回头指针
}
void print(eatery * p, char * c)
{
static int price = 0; //此部分原想在另一个函数里赋予需要查找的食物的价格,偷下懒直接归零
if(p == NULL) //链表结尾判断
return;
while(p->food_head != NULL) //循环查找所有餐馆
{
if(strcmp(p->food_head->food_name, c) == 0)//判断是否存在要查找的食物
{
if(p->food_head->food_price > price) //如果价格比最低价格高
{
print(p->next, c); //进入递归循环继续查找
}
printf("食物%s,价格%d, ", p->food_head->food_name, p->food_head->food_price); //递反显示
price = p->food_head->food_price; //最低价格赋值
break;
}
p->food_head = p->food_head->next; //餐馆指针位置后移
}
printf("%s餐馆,地址%s。", p->eatery_name, p->eatery_address);//打印餐馆信息
printf("\n");//换行符
}
//最后这个函数弄不好,大神帮忙,用递归或迭代实现都可以,求指教。 我也作为练习,写了一些代码...
/* CanGuan.h */
struct Node_CanGuan;
typedef Node_CanGuan CanGuan;
struct Node_ShiWu;
typedef Node_ShiWu ShiWu;
struct Node_Record;
typedef Node_Record Record;
Record*
Create_Record_List();
Record*
Create_Next_CanGuan_Record( const char* name, CanGuan* X );
void
Insert_Record_List( Record* X, Record* Head );
void
Sort_Record_List( Record* Head );
void
Print_Record_List( Record* Head );
void
Destroy_Record_List( Record* Head );
/* 实现.c */
#include "CanGuan.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*---------------------------------------------------------------------------*/
Record*
Create_Record_List()
{
Record*p;
p = malloc( sizeof( Record ) );
return p;
}
/*---------------------------------------------------------------------------*/
Record*
Create_Next_CanGuan_Record( const char* name, CanGuan* X )
{
CanGuan*p;
ShiWu *p1;
Record *p2;
if( X == NULL || p = X->next == NULL )
return NULL;
p2 = malloc( sizeof( Record ) );
if( p2 == NULL )
{
printf( "Create_Next_CanGuan_Record运行时内存不足\n" );
return NULL;
}
while( p != NULL )
if( p1 = Find_ShiWu( name, p->list ) != NULL )
{
p2->position = p;
p2->price = p1->price;
break;
}
else
p = p->next;
if( p == NULL )
{
printf( "没有找到餐馆信息,请重试...\n" );
return NULL;
}
else
return p2;
}
/*------*/
static ShiWu*
Find_ShiWu( const char* name, ShiWu* Head )
{
ShiWu*p = Head->next;
while( p != NULL )
if( strcmp( name, p->name ) == 0 )
break;
else
p = p->next;
return p;
}
/*---------------------------------------------------------------------------*/
void
Insert_Record_List( Record* X, Record* Head )
{
Record*p;
if( Head == NULL )
return;
p = Head;
while( p->next != NULL )
p = p->next;
p->next = X;
X->next = NULL;
}
/*---------------------------------------------------------------------------*/
void/* 我用的插入排序法 */
Sort_Record_List( Record* Head )
{
Record Tmp;
Record *a, *b;
a = Head->next;
while( a != NULL )
{
b = a->next;
while( b != NULL )
if( b->price < a->price )
{
Tmp->price = a->price;
a->price = b->price;
b->price = Tmp->price;
Tmp->position = a->position;
a->position = b->position;
b->position = Tmp->position;
}
else
b = b->next;
}
}
/*---------------------------------------------------------------------------*/
void
Print_Record_List( Record* Head )
{
Record* p;
if( Head == NULL || p = Head->next == NULL )
{
printf( "记录为空\n" );
return;
}
while( p != NULL )
{
printf( "价格: %d\n餐馆名称: %s\n餐馆地址: %s\n\n",
p->price, p->position->name, p->position->address );
p = p->next;
}
}
/*---------------------------------------------------------------------------*/
void
Destroy_Record_List( Record* Head )
{
Record*p1, *p2;
p1 = Head;
p2 = p1->next;
while( p1 != NULL )
{
free( p1 );
p1 = p2;
p2 = p1->next;
}
}
/* 接口.C */
#include "CanGuan.h"
#include <stdio.h>
/*---------------------------------------------------------------------------*/
struct Node_ShiWu
{
char* name[ 20 ];
int price;
ShiWu* next;
};
struct Node_CanGuan
{
char* name[ 20 ];
char* address[ 20 ];
ShiWu* list;
CanGuan* next;
};
struct Node_Record
{
CanGuan* position;
int price;
Record* next;
};
/*---------------------------------------------------------------------------*/
void
main()
{
/* 假设餐馆的头结点是Head */
Record *p;
CanGuan *p1;
char* name[ 20 ];
p = Create_Record_List();
if( p == NULL )
{
printf( "Create_Record_list运行时内存不足\n" );
return;
}
while(1)
if( scanf( "%s", name ) == 1 )
break;
p1 = Head;
while( p1 != NULL )
{
p = Create_Next_CanGuan_Record( name, p1 );
if( p == NULL )
return;
Insert_Record_List( p );
p1 = p1->next;
}
Print_Record_List( p );
Destroy_Record_List( p );
} 本帖最后由 lzgw 于 2017-1-11 19:57 编辑
代码农民 发表于 2017-1-10 17:54
我也作为练习,写了一些代码...
我也把代码发上来,探讨一下哪个更省事,偷懒没建.h 和.c文件,都放一起了
/*商店信息系统
以商店为单位按价格
由低到高显示所需物品*/
#include <stdio.h>
#include <stdlib.h>
typedef struct b1 //定义内层结构体
{
char name; //物品名称
int b; //物品价格
struct b1 * next; //内层节点指针
}b; //自定义类型名为b
typedef struct a1 //定义外层结构体
{
char a; //商铺名称
struct b1 * head; //内层结构体头指针
struct a1 * next; //外层节点指针
}a; //自定义类型名为a;
typedef a * A; //自定义a类型指针为A
A input_c(); //输入外层链表数据
b * input_i();//输入内层链表数据
A paixu(A pai, int num); //对外层链表排序
void print(A head); //打印链表数据(内外层)
void print_pai(A head); //打印排序后链表数据(内外层)
void main() //主函数
{
int num = 0; //外层链表节点计数器
A head; //外层链表头指针
head = input_c(&num);//输入函数
printf("\n");
printf("排序前\n");
print(head); //显示函数
head = paixu(head, num);//排序函数
printf("\n");
printf("排序后\n");
print_pai(head); //显示函数
}
输入函数略;
void print(A p_head) //显示函数
{
A head = p_head; //设定一个外层链表指针代替头指针,防止指针后移影响其他函数操作
b * p; //设定一个内层链表指针代替头指针,防止指针后移影响其他函数操作
while(head)
{
printf("%s店铺", head->a); //打印第一个店铺名称
p = head->head; //内层链表指针赋值
while(p)
{
printf("%s=", p->name); //打印内层物品名称
printf("%d。", p->b);//打印内层物品价格
p = p->next; //内层链表指针指向下一个节点
}
printf("\n");
head = head->next; //外层链表指针指向下一个节点
}
printf("\n");
}
void print_pai(A p_head) //显示函数
{
char temp = "app";//此处假定查找的物品名,可以用交互式输入代替
A head = p_head; //设定一个外层链表指针代替头指针,防止指针后移影响其他函数操作
b * p; //设定一个内层链表指针代替头指针,防止指针后移影响其他函数操作
while(head)
{
p = head->head; //内层链表指针赋值
while(p && (strcmp(p->name, temp) != 0))//查找是否有要显示的物品
p = p->next;
if(p && (strcmp(p->name, temp) == 0)) //若有则执行
{
printf("%s店铺", head->a); //打印第一个店铺名称
p = head->head; //内层链表指针赋值
while(p)
{
if(strcmp(p->name, temp) == 0)
{
printf("%s=", p->name); //打印内层物品名称
printf("%d。", p->b);//打印内层物品价格
}
p = p->next; //内层链表指针指向下一个节点
}
printf("\n");
}
head = head->next;//外层链表指针指向下一个节点
}
printf("\n");
}
#if(0)
A paixu(A pai, int num)//排序函数(未完善)
{
A p1,p2,p3; //设定三个外层指针
char temp = "app"; //此处假定查找的物品名,可以用交互式输入代替
while(num)
{
p3 = p1 = pai; //p1指向头结点,第一个店铺
p2 = p1->next; //p2指向p1后的节点,第二个店铺
while(p2)
{
while(p1->head && (strcmp(p1->head->name, temp) != 0))
p1->head = p1->head->next;
//若没有该物品,则p1->head变成空指针
while(p2->head && (strcmp(p2->head->name, temp) != 0))
p2->head = p2->head->next;
//若没有该物品,则p2->head变成空指针
if((p1->head != NULL) && (p2->head != NULL) && (p1->head->b > p2->head->b))
//若p1店内有该物品并且p1店铺内的物品价格大于p2店铺的物品价格
{
p1->next = p2->next; //p1尾指针指向p2尾指针
p2->next = p1; //p2尾指针指向p1
//此处完成p1和p2的位置交换
if(p1 == pai)// p1为第一节点的时候
{
pai = p3 = p2; //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
}
else //p1不是第一个节点的时候
{
p3->next = p2; //p3尾指针指向p2
p3 = p2; //p3指向p2,即p3永远指向p1的上一个节点
}
p2 = p1->next; //p2指针指向p1的后一个节点
}
else if((p1->head == NULL) || (p2->head != NULL) && (p1->head->b <= p2->head->b))
// 若p1店铺内没有该物品,或物品价格小于等于p2店铺的物品价格
{
p3 = p1; //p3指向p1; p1,p2都后移一个节点
p2 = p2->next;
p1 = p1->next;
}
}
num--;
}
return pai; //返回外层链表头指针
}
#else
A paixu(A pai, int num)//排序函数(已完善)
{
A p1,p2,p3; //设定三个外层指针
b * q1, *q2;//定义2个内层指针
char temp = "app";
while(num)
{
p3 = p1 = pai; //p1指向头结点,第一个店铺
p2 = p1->next; //p2指向p1后的节点,第二个店铺
while(p2)
{
q1 = p1->head;
q2 = p2->head;
while(q1 && (strcmp(q1->name, temp) != 0))
q1 = q1->next;
//若没有该物品,则p1->head变成空指针
while(q2 && (strcmp(q2->name, temp) != 0))
q2 = q2->next;
//若没有该物品,则p2->head变成空指针
if(q1 == NULL)//若p1店内有该物品并且p1店铺内的物品价格大于p2店铺的物品价格
{
p3 = p1; //p3指向p1; p1,p2都后移一个节点
p2 = p2->next;
p1 = p1->next;
}
else if((q1 != NULL) && (q2 == NULL))
{
p1->next = p2->next; //p1尾指针指向p2尾指针
p2->next = p1; //p2尾指针指向p1
//此处完成p1和p2的位置交换
if(p1 == pai)// p1为第一节点的时候
{
pai = p3 = p2; //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
}
else //p1不是第一个节点的时候
{
p3->next = p2; //p3尾指针指向p2
p3 = p2; //p3指向p2,即p3永远指向p1的上一个节点
}
p2 = p1->next; //p2指针指向p1的后一个节点
}
else if((q1 != NULL) && (q2 != NULL))
{
if(q1->b > q2->b)
{
p1->next = p2->next; //p1尾指针指向p2尾指针
p2->next = p1; //p2尾指针指向p1
//此处完成p1和p2的位置交换
if(p1 == pai)// p1为第一节点的时候
{
pai = p3 = p2; //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
}
else //p1不是第一个节点的时候
{
p3->next = p2; //p3尾指针指向p2
p3 = p2; //p3指向p2,即p3永远指向p1的上一个节点
}
p2 = p1->next; //p2指针指向p1的后一个节点
}
else //(p1->head->b <= p2->head->b) 若p1店铺内没有该物品,或物品价格小于等于p2店铺的物品价格
{
p3 = p1; //p3指向p1; p1,p2都后移一个节点
p2 = p2->next;
p1 = p1->next;
}
}
}
num--;
}
return pai; //返回外层链表头指针
}
#endif
页:
[1]