鱼C论坛

 找回密码
 立即注册
查看: 1502|回复: 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");  //换行符
}

//最后这个函数弄不好,大神帮忙,用递归或迭代实现都可以,求指教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-10 17:54:46 | 显示全部楼层
我也作为练习,写了一些代码...
/* 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 );
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

typedef struct b1             //定义内层结构体
{
        char          name[10];   //物品名称
        int           b;                  //物品价格
        struct b1 *   next;       //内层节点指针
}b;                           //自定义类型名为b
typedef struct a1             //定义外层结构体
{
        char          a[10];           //商铺名称
        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[10] = "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[10] = "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[10] = "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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 19:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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