c链表操作

本文介绍了一个基于链表实现的商品库存管理系统,包括商品信息的初始化、修改、增加、提货及信息查询等功能。系统提供了用户友好的菜单操作界面,支持数据文件读写,确保数据的持久化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int shangpinshu;
//我把提货分成了两种,完全提光的直接删除链表,不完全提光的修改一下就好了
//我在208行的main函数中对输入是否合法进行了检验,附加功能,菜单栏输入是否合法的检验
typedef struct goods //在此定义了链表类型的结构体goods
{
    char goodsname[20];
    char company[20];
    int price;
    int amount;
    struct goods *next;
} LinkList;

LinkList *creat(int n) //该函数的功能是初始化链表,因为返回值linklist是一个指针所以在creat前面加了个*
{
    LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
    head = (LinkList*)malloc(sizeof(LinkList));//分配地址
    end = head;         //若是空链表则头尾节点一样
    for (int i = 0; i < n; i++)
    {
        node = (LinkList*)malloc(sizeof(LinkList));
        printf("请输入第%d件商品的信息\n",i+1);
        printf("请输入商品名称(不超过20个字)\n");
        scanf("%s", node->goodsname);
        printf("请输入商品制造商名称(不超过20个字)\n");
        scanf("%s", node->company);
        printf("请输入商品价格\n");
        scanf("%d", &node->price);
        printf("请输入商品数量\n");
        scanf("%d", &node->amount);
        end->next = node;
        end = node;
    }
    end->next = NULL;//结束创建
    return head;
}
//     定义链表插入函数
//    在链表位置第pos节点前插入包含数据val的节点
void InsertList(LinkList *List, int val,int va2,char zi1[],char zi2[] )
{
    int position = 0;
    int pos=2;
    LinkList *P = List;    //    定义节点p指向头节点
    //    寻找pos节点的前驱结点
    while (P != NULL&&position<pos - 1)
    {
        P = P->next;
        ++position;
    }
    LinkList *Tmp = (LinkList*)malloc(sizeof(LinkList));    //    分配一个临时节点用来存储要插入的数据
    if (Tmp == NULL)
    {
        printf("内存分配失败!");
        exit(-1);
    }
    //    插入节点
    Tmp->amount = val;
    Tmp->price = va2;
    strcpy(Tmp->goodsname,zi1);
    strcpy(Tmp->company,zi2);
    Tmp->next = P->next;
    P->next = Tmp;
}
void insertSort(LinkList *mylist)//排序,按照价格的升序排序
{
    if((mylist->next == NULL) || (mylist -> next -> next == NULL))
    {
        return;
    }

    LinkList * head, * p1, * prep1, * p2, * prep2, * temp;
    head = mylist;
    prep1 = head -> next;
    p1 = prep1 -> next;
    //prep1和p1是否需要手动后移
    bool flag;

    while(p1 != NULL)
    {
        flag = true;
        temp = p1;
        //由于是单向链表,所以只能从头部开始检索
        for(prep2 = head, p2 = prep2 -> next; p2 != p1; prep2 = prep2 -> next, p2 = p2 -> next)
        {
            //发现第一个较大值
            if(p2->price < p1->price)
            {
                p1 = p1 -> next;
                prep1 -> next = p1;
                prep2 -> next = temp;
                temp -> next = p2;
                flag = false;
                break;
            }
        }
        //手动后移prep1和p1
        if(flag)
        {
            prep1 = prep1 -> next;
            p1 = p1 -> next;
        }
    }
}
LinkList *DeleteValueNode(LinkList *pNode,char x[20]) //用于删除数据
{


    LinkList *pMovePre;
    LinkList *pMove;
    pMovePre = pNode;
    pMove = pNode->next;
    while (pMove != NULL)
    {
        if (strcmp(pMove->goodsname,x) == 0)
        {
            pMovePre->next = pMove->next;
            free(pMove);
            pMove = NULL;

            printf("成功记录提货信息\n");
            return pNode;
        }
        pMovePre = pMovePre->next;
        pMove = pMove->next;
    }

    printf("提货信息记录失败\n");

    return pNode;
}


void  WritetoFile(LinkList *head,int n)
{
    FILE *fp;
    int i,flag;
    LinkList *wr;
    wr=head;
    flag=1;
    if((fp = fopen("shop.txt","w"))==NULL)
    {
        printf("写入数据失败了,回家等着下岗吧!\n");
        flag=0;
    }
    if(flag==1)
    {
        fprintf(fp,"%d\t",n);
        for(i = 0; i < n; i++)
        {
            wr=wr->next;
            fprintf(fp,"%20s%20s%10d%10d",wr->goodsname,wr->company,wr->price,wr->amount);
        }
        fclose(fp);
    }
}
LinkList  *ReadfromFile(LinkList *head,int n)
{
    FILE *fp;
    int i,flag;
    LinkList *wr;
    wr=head;
    flag=1;
    if((fp=fopen("shop.txt","r"))==NULL)
    {
        printf("读取数据失败了,回家等着下岗吧!\n");
        flag=0;
    }
    if(flag==1)
    {
        fprintf(fp,"%d\t",shangpinshu);
        for(i = 0; i < shangpinshu; i++)
        {
            wr=wr->next;
            fprintf(fp,"%20s%20s%10d%10d",wr->goodsname,wr->company,wr->price,wr->amount);
        }
        fclose(fp);
    }
    return head;

}

int main()
{
    int i;
    int choice;
    int flag1;
    char aa3[20];
    int b2;
    int bb2;
    char bbb2[20];
    char bbbb2[20];
    char diyi[20];
    int yi;
    LinkList *tmp4,*tmp5,*tmp11;
    for(i=0; i<=10000; i++)
    {
        printf("请问您想做什么\n");
        printf("请输入您想做的事情的编号例如输入1即可进入1的功能\n");
        printf("0.初始化商品信息(前提是什么信息都没输入过才可以)\n");//ok
        printf("1.变动(在已有商品信息上进行修改)\n");                //ok
        printf("2.进货(新增一个商品)\n");                            //ok
        printf("3.提货(减少一个商品,如果不完全提光请进入1修改)\n"); //ok
        printf("4.查询信息\n");
        printf("5.开始营业\n");                                      //ok
        printf("6.营业结束\n");
        flag1=scanf("%d",&choice);
        if((flag1==1)&&(choice<8)&&(choice>-1))
        {
            switch (choice)
            {
            case 0:
                printf("请输入有多少件商品");
                scanf("%d",&shangpinshu);
                tmp4=creat(shangpinshu);
                insertSort(tmp4);
                break;
            case 1:
                printf("请输入您想更改信息的产品的名字");
                scanf("%s",diyi);
                tmp11=tmp4->next;
                for(i=0; i<shangpinshu; i++)
                {
                    if(strcmp(tmp11->goodsname,diyi)==0)
                    {
                        printf("更改商品名请按1,更改制造商名称请按2,更改售价请按3,更改数量请按4\n");
                        scanf("%d",&yi);
                        switch (yi)
                        {
                        case 1:
                            printf("请输入现在商品名");
                            scanf("%s",tmp11->goodsname);
                            break;
                        case 2:
                            printf("请输入现在制造商名");
                            scanf("%s",tmp11->company);
                            break;
                        case 3:
                            printf("请输入现在售价");
                            scanf("%d",&tmp11->price);
                            break;
                        case 4:
                            printf("请输入现在数量");
                            scanf("%d",&tmp11->amount);
                            break;
                        }
                    }

                    tmp11=tmp11->next;
                }
                break;
            case 2:

                printf("请输入商品名称(不超过20个字)\n");
                scanf("%s", bbb2);
                printf("请输入商品制造商名称(不超过20个字)\n");
                scanf("%s", bbbb2);
                printf("请输入商品价格\n");
                scanf("%d", &b2);
                printf("请输入商品数量\n");
                scanf("%d", &bb2);
                InsertList(tmp4,bb2,b2,bbb2,bbbb2);
                shangpinshu = shangpinshu + 1;
                break;
            case 3:
                printf("请输入您要提货并提空的商品的名字\n");
                scanf("%s",aa3);
                getchar();
                tmp4=DeleteValueNode(tmp4,aa3);
                shangpinshu = shangpinshu-1;
                break;
            case 4:
                tmp5 = tmp4;
                insertSort(tmp4);
                for(i=0; i<=1000; i++)
                {
                    if(tmp5->next != NULL)
                    {
                        tmp5 = tmp5->next;

                        printf("第%d件商品的价格为%d,名称为%s,制造商为%s,数量为%d  \n",i+1, tmp5->price, tmp5->goodsname, tmp5->company, tmp5->amount);
                        printf(" \n");
                    }
                    else
                    {
                        break;
                    }
                }

                break;
            case 5:
               tmp4 = ReadfromFile(tmp4,shangpinshu);
                break;
            case 6:
                WritetoFile(tmp4,shangpinshu);
                break;

            default:
                printf("请重新输入一个数字");
            }
        }
        else
        {
            printf("输入错误,请重新输入数字");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值