鱼C论坛

 找回密码
 立即注册
查看: 1728|回复: 2

求指教,输入一个食物名称,按序显示,最后显示部分弄不好。

[复制链接]
发表于 2017-1-7 18:05:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/* 习题要求创建一个餐馆结构,对于给定食物,要按最小花费显示出所有餐馆*/

#include <stdio.h>
#include <malloc.h>

typedef struct uct_food //食物结构体,用来创建餐馆内食物链表
{
        char food_name[10];   //食物名称
        int food_price;       //食物价格
        struct uct_food * next; //链表尾节点指针
} FOOD;

typedef struct uct_eatery  //餐馆结构体 ,用来创建餐馆链表
{
        char eatery_name[10];    //餐馆名称
        char eatery_address[10]; //餐馆地址
        FOOD * food_head;        //食物链表头指针
        struct eatery * next;    //链表尾节点指针
}EATERY;

typedef EATERY eatery;  //自定义

eatery * input();    //函数声明
void print(eatery * p, char * c); //函数声明

void main()
{
        eatery * head;   //餐馆指针
        char f[10];   //存放查找的食物名称
        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[10];     //临时字符数组
        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");  //换行符
}

//最后这个函数弄不好,大神帮忙,用递归或迭代实现都可以,求指教。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-10 17:54:46 | 显示全部楼层
我也作为练习,写了一些代码...

  1. /* CanGuan.h */
  2. struct Node_CanGuan;
  3. typedef Node_CanGuan CanGuan;

  4. struct Node_ShiWu;
  5. typedef Node_ShiWu ShiWu;

  6. struct Node_Record;
  7. typedef Node_Record Record;

  8. Record*
  9. Create_Record_List();
  10. Record*
  11. Create_Next_CanGuan_Record( const char* name, CanGuan* X );
  12. void
  13. Insert_Record_List( Record* X, Record* Head );
  14. void
  15. Sort_Record_List( Record* Head );
  16. void
  17. Print_Record_List( Record* Head );
  18. void
  19. Destroy_Record_List( Record* Head );



复制代码



  1. /* 实现.c */
  2. #include "CanGuan.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. /*---------------------------------------------------------------------------*/
  7. Record*
  8. Create_Record_List()
  9. {
  10.     Record  *p;

  11.     p = malloc( sizeof( Record ) );
  12.    
  13.     return p;
  14. }
  15. /*---------------------------------------------------------------------------*/
  16. Record*
  17. Create_Next_CanGuan_Record( const char* name, CanGuan* X )
  18. {
  19.     CanGuan  *p;
  20.     ShiWu    *p1;
  21.     Record   *p2;
  22.    
  23.     if( X == NULL || p = X->next == NULL )
  24.         return NULL;
  25.    
  26.     p2 = malloc( sizeof( Record ) );
  27.     if( p2 == NULL )
  28.     {
  29.         printf( "Create_Next_CanGuan_Record运行时内存不足\n" );
  30.         return NULL;
  31.     }

  32.     while( p != NULL )
  33.        if( p1 = Find_ShiWu( name, p->list ) != NULL )
  34.        {
  35.             p2->position = p;
  36.             p2->price = p1->price;
  37.             break;
  38.        }
  39.        else
  40.         p = p->next;

  41.     if( p == NULL )
  42.     {
  43.         printf( "没有找到餐馆信息,请重试...\n" );
  44.         return NULL;
  45.     }
  46.     else
  47.         return p2;
  48. }

  49. /*------*/
  50. static ShiWu*
  51. Find_ShiWu( const char* name, ShiWu* Head )
  52. {
  53.     ShiWu  *p = Head->next;

  54.     while( p != NULL )
  55.         if( strcmp( name, p->name ) == 0 )
  56.             break;
  57.         else
  58.             p = p->next;

  59.     return p;
  60. }
  61. /*---------------------------------------------------------------------------*/
  62. void
  63. Insert_Record_List( Record* X, Record* Head )
  64. {
  65.     Record*  p;

  66.     if( Head == NULL )
  67.         return;
  68.    
  69.     p = Head;
  70.     while( p->next != NULL )
  71.         p = p->next;

  72.     p->next = X;
  73.     X->next = NULL;
  74. }
  75. /*---------------------------------------------------------------------------*/
  76. void/* 我用的插入排序法 */
  77. Sort_Record_List( Record* Head )
  78. {
  79.     Record Tmp;
  80.     Record *a, *b;

  81.     a = Head->next;
  82.     while( a != NULL )
  83.     {
  84.         b = a->next;
  85.         while( b != NULL )
  86.         if( b->price < a->price )
  87.         {
  88.             Tmp->price = a->price;
  89.             a->price = b->price;
  90.             b->price = Tmp->price;

  91.             Tmp->position = a->position;
  92.             a->position = b->position;
  93.             b->position = Tmp->position;
  94.         }
  95.         else
  96.             b = b->next;
  97.     }
  98. }
  99. /*---------------------------------------------------------------------------*/
  100. void
  101. Print_Record_List( Record* Head )
  102. {
  103.     Record* p;

  104.     if( Head == NULL || p = Head->next == NULL )
  105.     {
  106.         printf( "记录为空\n" );
  107.         return;
  108.     }

  109.     while( p != NULL )
  110.     {
  111.         printf( "价格: %d\n餐馆名称: %s\n餐馆地址: %s\n\n",
  112.                 p->price, p->position->name, p->position->address );
  113.         p = p->next;
  114.     }
  115. }
  116. /*---------------------------------------------------------------------------*/
  117. void
  118. Destroy_Record_List( Record* Head )
  119. {
  120.     Record  *p1, *p2;

  121.     p1 = Head;
  122.     p2 = p1->next;
  123.    
  124.     while( p1 != NULL )
  125.     {
  126.         free( p1 );
  127.         p1 = p2;
  128.         p2 = p1->next;
  129.     }
  130. }
复制代码




  1. /* 接口.C */

  2. #include "CanGuan.h"
  3. #include <stdio.h>
  4. /*---------------------------------------------------------------------------*/
  5. struct Node_ShiWu
  6. {
  7.     char*           name[ 20 ];
  8.     int             price;
  9.     ShiWu*          next;
  10. };
  11. struct Node_CanGuan
  12. {
  13.     char*           name[ 20 ];
  14.     char*           address[ 20 ];
  15.     ShiWu*          list;  
  16.     CanGuan*        next;
  17. };
  18. struct Node_Record
  19. {
  20.     CanGuan*         position;
  21.     int              price;
  22.     Record*          next;
  23. };
  24. /*---------------------------------------------------------------------------*/
  25. void
  26. main()
  27. {   
  28.     /* 假设餐馆的头结点是Head */
  29.     Record    *p;
  30.     CanGuan   *p1;
  31.     char*      name[ 20 ];

  32.     p = Create_Record_List();
  33.     if( p == NULL )
  34.     {
  35.         printf( "Create_Record_list运行时内存不足\n" );
  36.         return;
  37.     }

  38.     while(1)
  39.         if( scanf( "%s", name ) == 1 )
  40.             break;
  41.    
  42.     p1 = Head;
  43.     while( p1 != NULL )
  44.     {
  45.         p = Create_Next_CanGuan_Record( name, p1 );
  46.         if( p == NULL )
  47.             return;
  48.         
  49.         Insert_Record_List( p );
  50.         p1 = p1->next;
  51.     }
  52.    
  53.     Print_Record_List( p );
  54.     Destroy_Record_List( p );
  55. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-11 14:35:53 | 显示全部楼层
本帖最后由 lzgw 于 2017-1-11 19:57 编辑
代码农民 发表于 2017-1-10 17:54
我也作为练习,写了一些代码...


我也把代码发上来,探讨一下哪个更省事,偷懒没建.h 和.c文件,都放一起了
  1. /*商店信息系统
  2. 以商店为单位按价格
  3. 由低到高显示所需物品*/

  4. #include <stdio.h>
  5. #include <stdlib.h>

  6. typedef struct b1             //定义内层结构体
  7. {
  8.         char          name[10];   //物品名称
  9.         int           b;                  //物品价格
  10.         struct b1 *   next;       //内层节点指针
  11. }b;                           //自定义类型名为b
  12. typedef struct a1             //定义外层结构体
  13. {
  14.         char          a[10];           //商铺名称
  15.         struct b1 *   head;       //内层结构体头指针
  16.         struct a1 *   next;       //外层节点指针
  17. }a;                      //自定义类型名为a;
  18. typedef a * A;   //自定义a类型指针为A

  19. A input_c();    //输入外层链表数据
  20. b * input_i();  //输入内层链表数据
  21. A paixu(A pai, int num); //对外层链表排序
  22. void print(A head); //打印链表数据(内外层)
  23. void print_pai(A head); //打印排序后链表数据(内外层)

  24. void main()     //主函数
  25. {
  26.         int num = 0;   //外层链表节点计数器
  27.         A head;        //外层链表头指针
  28.         head = input_c(&num);  //输入函数
  29.         printf("\n");
  30.         printf("排序前\n");
  31.         print(head);           //显示函数
  32.         head = paixu(head, num);  //排序函数
  33.         printf("\n");
  34.         printf("排序后\n");
  35.         print_pai(head);   //显示函数
  36. }

  37. 输入函数略;

  38. void print(A p_head)   //显示函数
  39. {
  40.         A head = p_head;   //设定一个外层链表指针代替头指针,防止指针后移影响其他函数操作
  41.         b * p;             //设定一个内层链表指针代替头指针,防止指针后移影响其他函数操作
  42.         while(head)
  43.         {      
  44.                
  45.                 printf("%s店铺  ", head->a); //打印第一个店铺名称
  46.                 p = head->head;   //内层链表指针赋值
  47.                 while(p)
  48.                 {
  49.                         printf("%s=", p->name); //打印内层物品名称
  50.                         printf("%d。", p->b);  //打印内层物品价格
  51.                         p = p->next; //内层链表指针指向下一个节点
  52.                 }
  53.                 printf("\n");
  54.                 head = head->next;   //外层链表指针指向下一个节点
  55.         }
  56.         printf("\n");
  57. }

  58. void print_pai(A p_head)   //显示函数
  59. {
  60.         char temp[10] = "app";  //此处假定查找的物品名,可以用交互式输入代替
  61.         A head = p_head;   //设定一个外层链表指针代替头指针,防止指针后移影响其他函数操作
  62.         b * p;             //设定一个内层链表指针代替头指针,防止指针后移影响其他函数操作
  63.         while(head)
  64.         {      
  65.                 p = head->head;   //内层链表指针赋值
  66.                 while(p && (strcmp(p->name, temp) != 0))//查找是否有要显示的物品
  67.                         p = p->next;   
  68.                 if(p && (strcmp(p->name, temp) == 0)) //若有则执行  
  69.                 {
  70.                         printf("%s店铺  ", head->a); //打印第一个店铺名称
  71.                         p = head->head;   //内层链表指针赋值
  72.                         while(p)
  73.                         {
  74.                                 if(strcmp(p->name, temp) == 0)
  75.                                 {
  76.                                         printf("%s=", p->name); //打印内层物品名称
  77.                                         printf("%d。", p->b);  //打印内层物品价格
  78.                                 }
  79.                                 p = p->next; //内层链表指针指向下一个节点
  80.                         }
  81.                         printf("\n");
  82.                 }      
  83.                 head = head->next;  //外层链表指针指向下一个节点
  84.         }
  85.         printf("\n");
  86. }
  87. #if(0)
  88. A paixu(A pai, int num)  //排序函数(未完善)
  89. {
  90.         A p1,p2,p3;     //设定三个外层指针
  91.         char temp[10] = "app"; //此处假定查找的物品名,可以用交互式输入代替
  92.         while(num)
  93.         {
  94.                 p3 = p1 = pai;   //p1指向头结点,第一个店铺
  95.                 p2 = p1->next;   //p2指向p1后的节点,第二个店铺
  96.                 while(p2)
  97.                 {
  98.                         while(p1->head && (strcmp(p1->head->name, temp) != 0))
  99.                                 p1->head = p1->head->next;
  100.                         //若没有该物品,则p1->head变成空指针
  101.                         while(p2->head && (strcmp(p2->head->name, temp) != 0))
  102.                                 p2->head = p2->head->next;
  103.                         //若没有该物品,则p2->head变成空指针
  104.                        
  105.                         if((p1->head != NULL) && (p2->head != NULL) && (p1->head->b > p2->head->b))  
  106.                           //  若p1店内有该物品并且p1店铺内的物品价格大于p2店铺的物品价格
  107.                         {
  108.                                 p1->next = p2->next;       //p1尾指针指向p2尾指针
  109.                                 p2->next = p1;             //p2尾指针指向p1
  110.                                 //此处完成p1和p2的位置交换
  111.                                 if(p1 == pai)// p1为第一节点的时候
  112.                                 {
  113.                                         pai = p3 = p2;   //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
  114.                                 }
  115.                                 else    //p1不是第一个节点的时候
  116.                                 {
  117.                                         p3->next = p2;   //p3尾指针指向p2
  118.                                         p3 = p2;         //p3指向p2,即p3永远指向p1的上一个节点
  119.                                 }
  120.                                 p2 = p1->next;   //p2指针指向p1的后一个节点
  121.                         }
  122.                         else if((p1->head == NULL) || (p2->head != NULL) && (p1->head->b <= p2->head->b))
  123.                                    // 若p1店铺内没有该物品,或物品价格小于等于p2店铺的物品价格
  124.                         {      
  125.                                 p3 = p1;         //p3指向p1;   p1,p2都后移一个节点
  126.                                 p2 = p2->next;
  127.                                 p1 = p1->next;
  128.                         }
  129.                 }
  130.                 num--;
  131.         }
  132.         return pai; //返回外层链表头指针
  133. }
  134. #else
  135. A paixu(A pai, int num)  //排序函数(已完善)
  136. {
  137.         A p1,p2,p3;     //设定三个外层指针
  138.         b *        q1, *q2;  //定义2个内层指针
  139.         char temp[10] = "app";
  140.         while(num)
  141.         {
  142.                 p3 = p1 = pai;   //p1指向头结点,第一个店铺
  143.                 p2 = p1->next;   //p2指向p1后的节点,第二个店铺
  144.                
  145.                 while(p2)
  146.                 {      
  147.                         q1 = p1->head;
  148.                         q2 = p2->head;
  149.                         while(q1 && (strcmp(q1->name, temp) != 0))
  150.                                 q1 = q1->next;
  151.                         //若没有该物品,则p1->head变成空指针
  152.                         while(q2 && (strcmp(q2->name, temp) != 0))
  153.                                 q2 = q2->next;
  154.                         //若没有该物品,则p2->head变成空指针
  155.                
  156.                         if(q1 == NULL)  //  若p1店内有该物品并且p1店铺内的物品价格大于p2店铺的物品价格
  157.                         {
  158.                                 p3 = p1;         //p3指向p1;   p1,p2都后移一个节点
  159.                                 p2 = p2->next;
  160.                                 p1 = p1->next;
  161.                         }
  162.                         else if((q1 != NULL) && (q2 == NULL))
  163.                         {
  164.                                 p1->next = p2->next;       //p1尾指针指向p2尾指针
  165.                                 p2->next = p1;             //p2尾指针指向p1
  166.                                 //此处完成p1和p2的位置交换
  167.                                 if(p1 == pai)// p1为第一节点的时候
  168.                                 {
  169.                                         pai = p3 = p2;   //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
  170.                                 }
  171.                                 else    //p1不是第一个节点的时候
  172.                                 {
  173.                                         p3->next = p2;   //p3尾指针指向p2
  174.                                         p3 = p2;         //p3指向p2,即p3永远指向p1的上一个节点
  175.                                 }
  176.                                 p2 = p1->next;   //p2指针指向p1的后一个节点
  177.                         }
  178.                         else if((q1 != NULL) && (q2 != NULL))
  179.                         {
  180.                                 if(q1->b > q2->b)
  181.                                 {
  182.                                         p1->next = p2->next;       //p1尾指针指向p2尾指针
  183.                                         p2->next = p1;             //p2尾指针指向p1
  184.                                         //此处完成p1和p2的位置交换
  185.                                         if(p1 == pai)// p1为第一节点的时候
  186.                                         {
  187.                                                 pai = p3 = p2;   //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
  188.                                         }
  189.                                         else    //p1不是第一个节点的时候
  190.                                         {
  191.                                                 p3->next = p2;   //p3尾指针指向p2
  192.                                                 p3 = p2;         //p3指向p2,即p3永远指向p1的上一个节点
  193.                                         }
  194.                                         p2 = p1->next;   //p2指针指向p1的后一个节点
  195.                                 }
  196.                                 else    //(p1->head->b <= p2->head->b) 若p1店铺内没有该物品,或物品价格小于等于p2店铺的物品价格
  197.                                 {      
  198.                                         p3 = p1;         //p3指向p1;   p1,p2都后移一个节点
  199.                                         p2 = p2->next;
  200.                                         p1 = p1->next;
  201.                                 }
  202.                         }
  203.                 }
  204.                 num--;
  205.         }
  206.         return pai; //返回外层链表头指针
  207. }
  208. #endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-11 05:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表