用自定义函数,链表与动态数组来表达集合数据

管理某个超市的商品。商品信息包括商品编号(条码号)、名称、库存数量、定价、折扣、生产日期、保质期(天)、类别。要求如下: 新增商品信息。修改商品信息,不允许修改商品编号。删除某种商品。商品编号和名称都是唯一的,新增和修改商品信息时需要保证这一约束。输入商品编号查询商品信息。输入商品名称查询商品信息。输出所有商品的信息报表。输出库存量低于某个数的商品信息报表。输出所有商品的价格报表,包括商品编号、名称、定价、折扣、折后价。统计平均价格(定价)。持久化商品信息到数据文件中。程序启动时自动读取商品数据文件中的数据到内存中。

基本就是链表的基本操作,可以尝试自己先写一写。
代码如下:

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

typedef struct _stuffinfo
{
    int id; //编号
    char name[20];//名称
    int kc; //库存
    float price; //定价
    float zk;  //折扣
    int year,mon,day;//生产日期
    int bzq; //保质期(天)
    char type[10]; //类别
    struct _stuffinfo* next;
}Stuffinfo;

//初始化链表
Stuffinfo* initList(Stuffinfo* head)
{
    head = (Stuffinfo*)malloc(sizeof(Stuffinfo));
    head->next = 0;
    return head;
}
//新增商品
void addStuf(Stuffinfo* head)
{
    Stuffinfo* tail;
    Stuffinfo* p = (Stuffinfo*)malloc(sizeof(Stuffinfo));
    p->next = 0;
    printf("请输入商品编号:");
    scanf("%d",&p->id);
    printf("请输入商品名称:");
    scanf("%s",p->name);
    printf("请输入库存数量:");
    scanf("%d",&p->kc);
    printf("请输入定价:");
    scanf("%f",&p->price);
    printf("请输入折扣(0-1):");
    scanf("%f",&p->zk);
    printf("请输入生产日期(YYYY MM DD):");
    scanf("%d %d %d",&p->year,&p->mon,&p->day);
    printf("请输入保质期:");
    scanf("%d",&p->bzq);
    printf("请输入类别:");
    scanf("%s",p->type);
    //找到链表的末尾
    tail = head;
    while(tail && tail->next)
        tail = tail->next;
    tail->next = p;
    printf("商品添加成功!\n");
}
//删除商品 根据商品编号删除
void delStuff(Stuffinfo* head)
{
    int id; //
    Stuffinfo* p,*front;
    printf("请输入需要删除的商品编号:");
    scanf("%d",&id);
    front = head;
    p = front->next;
    while(p)
    {
        if(p->id == id)
        {
            front->next = p->next;
            free(p);
            printf("删除成功!\n");
            return ;
        
        }else
        {
            front = p;
            p = p->next;
        }
    }
    printf("未找到改商品!\n");
}

//修改商品信息
void modStuff(Stuffinfo* head)
{
    int id; //
    Stuffinfo* p;
    printf("请输入需要修改信息的商品编号:");
    scanf("%d",&id);
    p = head->next;
    while(p)
    {
        if(p->id == id)
        {
            break;
        }else
            p = p->next;
    }
    if (p)
    {
        printf("请输入商品名称:");
        scanf("%s",p->name);
        printf("请输入库存数量:");
        scanf("%d",&p->kc);
        printf("请输入定价:");
        scanf("%f",&p->price);
        printf("请输入折扣(0-1):");
        scanf("%f",&p->zk);
        printf("请输入生产日期(YYYY MM DD):");
        scanf("%d %d %d",&p->year,&p->mon,&p->day);
        printf("请输入保质期:");
        scanf("%d",&p->bzq);
        printf("请输入类别:");
        scanf("%s",p->type);
        printf("商品信息修改成功!\n");
    }else
        printf("未找到该商品!\n");
}

//输出所有商品新
void showAllStuf(Stuffinfo* head)
{
    Stuffinfo* p;
    printf("所有商品信息如下:");
    p = head->next;
    while(p)
    {
        printf("%6d %20s %6d %6.2f %4.2f %4d-%2d-%2d %3d %10s\n",p->id,p->name,p->kc,p->price,p->kc,p->year,p->mon,p->day,p->bzq,p->type);
        p = p->next;
    }
}

//统计低于某个价格的商品信息
void tongji(Stuffinfo* head)
{
    Stuffinfo* p;
    int n;
    printf("请输入最低库存量:");
    scanf("%d",&n);
    printf("库存低于%d的商品如下:\n");
    p = head->next;
    while(p)
    {
        if(p->kc < n)
            printf("%6d %20s %6d %6.2f %4.2f %4d-%2d-%2d %3d %10s\n",p->id,p->name,p->kc,p->price,p->kc,p->year,p->mon,p->day,p->bzq,p->type);
    }
}

//输出所有商品的价格表,并统计平均价格
void showPrice(Stuffinfo* head)
{
    Stuffinfo* p = head->next;
    float ave = 0;
    int nmb = 0;
    printf("商品价格表:\n");
    while(p)
    {
        printf("%6d %20s %6.2f %4.2f %6.2f\n",p->id,p->name,p->price,p->kc,p->price*p->zk);
        nmb++;
        ave += p->price*p->zk;
        p = p->next;
    }
    printf("平均价格:%6.2f\n",ave/nmb);
}

//保存到文件
void saveFile(Stuffinfo* head)
{
    Stuffinfo* p;
    FILE* fp;
    fp = fopen("data.txt","w");
    p = head->next;
    while(p)
    {
        fprintf(fp,"%d %s %d %f %f %d-%d-%d %d %s\n",p->id,p->name,p->kc,p->price,p->kc,p->year,p->mon,p->day,p->bzq,p->type);
        p = p->next;
    }
    printf("保存成功!\n");
    fclose(fp);
}
//读取文件
void readFile(Stuffinfo* head)
{
    Stuffinfo *p,*t;
    FILE* fp = fopen("data.txt","r");
    t = head;
    while(!feof(fp))
    {
        p = (Stuffinfo *)malloc(sizeof(Stuffinfo));
        fscanf(fp,"%d %s %d %f %f %d-%d-%d %d %s\n",&p->id,p->name,&p->kc,&p->price,&p->kc,&p->year,&p->mon,&p->day,&p->bzq,p->type);
        if(p->id > 0)
        {
            t->next = p;
            t = p;
        }else
            free(p);
        
    }
    fclose(fp);
    printf("读取成功!\n");
}

int main()
{
    Stuffinfo* head=0;
    int op,flag = 1;
    head = initList(head);
    readFile(head); //读取文件数据
    while(flag)
    {
        printf("1.插入数据\n");
        printf("2.修改数据\n");
        printf("3.删除数据\n");
        printf("4.显示所有数据\n");
        printf("5.统计库存低于某个值的商品\n");
        printf("6.输出商品的价格表\n");
        printf("7.保存到文件\n");
        printf("0.退出\n");
        printf("请选择:");
        scanf("%d",&op);
        switch(op)
        {
        case 1:addStuf(head);break;
        case 2:modStuff(head);break;
        case 3:delStuff(head);break;
        case 4:showAllStuf(head);break;
        case 5:tongji(head);break;
        case 6:showPrice(head);break;
        case 7:saveFile(head);break;
        case 0:flag = 0;break;
        }
    }
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632