数据结构与算法分析大作业示例2-仓库管理系统.pdf
数据结构与算法设计大作业 数据结构与算法设计大作业题目名称:仓库管理系统班级:_ _ _ _ _ _ _ _姓名:_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _学号:_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _合作者:无日期:数据结构与算法设计大作业题 目 名 称一、选题 题 目 名 称:仓库管理系统应用背景;模拟仓库管理系统,可进行查询、添加、删除、修改货物信息的操作。需要实现简易的仓库管理系统以及给出提示操作。最终目标是能够进行询、添加、删除、修改货物信息的操作。二、需求分析软件的功能、性能要求:A.软件的功能要求:操作者可以根据自己的需求选择查询、添加、删除、修改货物信息的操作,并能够根据操作者的操作显示出操作提示。若操作者的需要进行操作的信息能够找到便输出相应的结果。B.软件的性能要求:用操作者操作的方便性,操作者可以直接进行操作选择,页面简洁明了。系统的人性化,该系统会出现操作提示,操作者可根据提示来进行操作。系统的稳定性,该系统较为稳定,只要是操作者按照提示进行的操作都会得到合理正确的回应,不会出现毫无理由的系统错误或者系统崩溃。选取的测试用例及对应的验收数据:2 数据结构与算法设计大作业货物信息2记事本文件(F)编辑(E)格式(0)查看(V)帮助(H)初始数据:衣柜 b l a c k 7 6 8 3 9 9 6 7 5鞋架 w h i t e 5 4 3 1 9 9 6 5 7桌子 p i n k 1 5 0 2 9 9 8 8 0三、概要设计(总体设计)设计 方案的论证:A.运用单链表:运用单链表将文件中的内容依次存放进其结点数据域,形成一一对应的关系,在删除以及添加操作时不涉及到其他元素的移动,同时其元素的存储单元是任意的,可连续也可不连续,不需要限定长度。但是,另一方面来说此方案也存在一定的缺点,要访问或者查找问特定元素,只能从链表头开始,遍历到该元素,其查找时间复杂度为O(n)。B.运用顺序表:运用顺序表用一组地址连续的存储单元依次存储数据元素,其优点在于其存储结构为随机存取结构,逻辑关系可直接用数组元素下标表示。但是线性表的长度不确定,难以事先确定数组长度。同时线性表要求存储空间必须是连续的,易造成存储空间的“碎片”现象。而其在插入和删除操作需要移动大量元素。C.运用循环链表:运用循环链表将文件中的内容依次存放进其结点数据域,形成一一对应的关系。其优点在于无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。同时,在循环链表中,从任一结点出发都可访问到表中所有结点,这样使得在某些运算中更加容易实现(如查询操作)。最终根据自己操作的熟练程度以及在添加、删除以及修改操作时3 数据结构与算法设计大作业的简便性选择了方案A。数据 结 构 的 设 计:为了实现对相应的查询、删除、添加、修改操作,定义了结构体数组以及单链表,并用单链表来存放相应的货物信息。在后续操作中对相应结点中的相关数据进行直接调用。typedef int datatype;typedef structchar name20;char colour20;int number;int price;int sales;node;/定义结构体,其中信息包含名字、颜色、数量、价 格、销量typedef struct Goodsnode goods;struct Goods*next;Jlinklist;定义单链表,用来连接货物信息 各 模 块 的 描 述:linklist*CreatList尾插法建立单链表,返回表头指针(并将“货物信息.txt”中的信息依次存入单链表的结点数据域)int Search(Iinklist*head)询货物信息,以及用户是否购买货物,4 数据结构与算法设计大作业查询相应信息时从链表头开始,遍历到该元素,然后若用户购买货物,则调用相应的数量以及销量(p-goods.number以及p-goods.sales)并对其进行相应的增减。int Inser(linklist*head)添加货物,输入相关信息并将它添加到头 结 点 的 位 置,并 在 文 件 中 修 改 信 息(用f=fopen(“货物信息.txt,”w);然后将单链表中存放的信息依次读入文件)int Delete(Iinkiist*head)删除货物,先通过货物名称从头结点开始查询,直 至!)strcmp(p-goods.name,ch)=0为止,在链表中删除结点*p,然后调用货物信息的文件,将现在链表中的信息重新存入文件。int change(linklist*head)修改货物信息,从链表头开始,遍历到该元素,然后根据需要修改相关信息。修改销量、数量5 数据结构与算法设计大作业四、详细设计1、Search 函数模块算法描述。关键代码实现(附注释)。int Search(linklist*head)查询货物信息,以及用户是否购买货物(char ch50;int i,n,numl,num2;FILE*fp;Iinklist*p,*s;printf(请输入您要查找的货物:nn);6 数据结构与算法设计大作业scanf(%s”,ch);p=(linklist*)malloc(sizeof(linklist);s=(linklist*)malloc(sizeof(linklist);p=head-next;for(p=head-next;p!=NULL;)/*查找要查询的货物,从头结点开始查询*/(if(strcmp(p-goods.name,ch)=0)(printf(该货物的相关信息为:n”);printf(u名 字:s颜 色:s数 量:%d 价 格:d销4 :%dnu,p-goods.name,p-goods.colour,p-goods.number,p-goods.price,p-goods.sales);/*查找到要查询的货物信息,然后输出其相关信息*/printf(您是否要购买此货物?(1、是 2、否)n”);scanf(d”,&i);if(i=l)(printf(请输入您要购买的件数:nn);scanf(n%d,&n);numl=p-goods.number;num2=p-goods.sales;/*修改相应的数量以及销量*/7 数据结构与算法设计大作业numl=numl-n;num2=num2+n;p-goods.number=numl;p-goods.sales=num2;/*将修改后的值重新赋给结点数据域*/)break;)p=p-next;if(p=NULL)/*历遍整个链表仍未查找到要查询的货物信息*/printf(未查找到您要查找的货物!n);)fp=fopen(货物信息.txt”Jw);for(s=head-next;s!=NULL;)/*读入文件*/(fprintf(fp,n%s%s%d%d%dn,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);s=s-next;)return 0;)2、Inser 函数8 数据结构与算法设计大作业模块算法描述。添加输入相关信息读入文件 关键代码实现(附注释)。int Inser(linklist*head)添加货物|Iinklist*s,*q;FILE*f;s=(linklist*)malloc(sizeof(linkHst);/*分配存储空间*/s-next=head-next;head-next=s;/*在头结点处插入新结点*/printf(”请输入货物的相关信息(名字、颜色、数量、价格、销量):暧);scanf(%s%s%d%d%dn,&s-goods.name,&s-goods.colour,&s-goods.number,&s-goods.price,&s-goods.sales);f=fopen(货 物 信 息 打 开 文 件*/for(s=head-next;s!=NULL;)/*读入文件*/(fprintf(f,n%s%s%d%d%dnn,s-goods.name,s-goods.colour,9 数据结构与算法设计大作业s-goods.number,s-goods.price,s-goods.sales);s=s-next;fclose(f);return 0;)3、Delete 函数模块算法描述。删除输入名称s t r cm p 函数进行比较不存在存在删除该结点读入文件 关键代码实现(附注释)。int Delete(linklist*head)删除货物10 数据结构与算法设计大作业char ch50;FILE*fp;int flag;linklist*p,*r,*s;s=(linklist*)malloc(sizeof(linklist);printf(请输入要删除的货物的名称:n);scanf(%s”,ch);r=head;for(p=head-next;p!=NULL;p=p-next)查找要查询的货物,从头结点开始查询(if(strcmp(p-goods.name,ch)=0)(printf(要删除的货物的相关信息为:nu);printf(名 字:s 颜 色:s 数 量:d 价 格:d 销i :%dn*,p-goods.name,p-goods.colour,p-goods.number,p-goods.price,p-goods.sales);/*查找到要查询的货物信息,然后输出其相关信息*/r-next=p-next;/在链表中删除结点*pfree(p);释放结点*pflag=l;/*i=l时,查找到需要删除的货物信息*/break;)1 1 数据结构与算法设计大作业else flag=2;/*i=2,未查找到*/)if(flag=l)fp=fopen(货物信息.txt1*w);/*打开文件*/s=head-next;whiIe(s-next!=NULL)/*读入文件*/(fprintf(fp,%s%s%d%d%dnn,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);s=s-next;)fprintf(fp,n%s%s%d%d%dn,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);)elseprintf(没有查找到您要删除的货物信息!n);fclose(fp);return 0;)4、change 函数12 数据结构与算法设计大作业模块算法描述。关键代码实现(附注释)。int change(linklist*head)/修改货物信息int num,i,m,flag;char ch50;13 数据结构与算法设计大作业Iinklist*p,*r,*s;FILE*f;printf(“您要修改的信息为:nl、数量 2、价格n”);scanf(n%du,&i);printf(“您要修改的货物信息的名称为:nn);scanf(n%sn,ch);if(i=l)/*修改数量*/p=(linklist*)malloc(sizeof(linklist);/*分配内存空间*/for(p=head-next;p!=NULL;p=p-next)if(strcmp(p-goods.name,ch)=0)/*查找到需要修改的信息*/printf(“您要把值修改为:n”);scanf(H%d,&num);p-goods.number=num;/*修改货物信息*/flag=l;break;else flag=2;)if(i=2)/*修改价格*/p=(linklist*)malloc(sizeof(linldist);/*分配内存空间*/14 数据结构与算法设计大作业for(p=head-next;p!=NULL;p=p-next)if(strcmp(p-goods.name,ch)=0)/*查找到需要修改的信息*/printf(“您要把值修改为:n”);scanf(,%d,&num);p-goods.price=num;/*修改货物信息*/flag=l;/*flag=l时,需要修改的货物信息存在*/break;)else flag=2;/*flag=2时,需要修改的货物信息不存在*/)f=fopen(货物信息.txt J w);/*打开文件*/if(flag=l)/*将修改后的相关信息读入文件*/s=head-next;/*s 指向头结点*/whiIe(s-next!=NULL)(fprintf(f,n%s%s%d%d%dnu,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);s=s-next;)15 数据结构与算法设计大作业fprintf(f,u%s%s%d%d%dn*,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);)else if(flag=2)printf(未查找到您要修改的相关货物信息!nn);fclose(f);return 0;)五、调试分析在调试分析中出现了以下问题:1、在查询操作中,选择购买此产品,在对相应货物数量变化以及销量 变 化 时,改 变 的 量 存在问题。逻辑错误 的 分 析:无法对p-goods.number p-goods.sales直接进行加减。解决方法:定义中间变量 numl、num 2,先将 p-goods.number p-goods.sales 中数据值赋值给num!、num2,然后对num 1 以及num2进行加减,最后将其赋值给p-goods.number以及p-goods.saleso(修改后的内容如下:)numl=p-goods.number;num2=p-goods.sales;/*修改相应的数量以及销量*/num 1=num l-n;num2=num2+n;p-goods.number=num 1;p-goods.sales=num2;/*将修改后的值重新赋给结点数据域*/16 数据结构与算法设计大作业2、(没有完全调试成功)在进行操作时,输入到文件中的内容多了一行内容,但进行的相应操作输出的结果正确。分析:可能是存在程序要求输 出 的 内 容 多 于 链 表 中 的 数 据,于 是 我 将 p!=N U L L 改为p-next!=NULL,然后单独读入最后一个结点中的信息。然后发现改后查找时修改了相应数据后读入文件的内容正确,但删除跟修改操作仍存在除去多了最后一行其他完全正确的情况。根据调试发现有可能是由于最后一行读入时仍有一个换行符导致最后自动读入了 一行内容,于是在将最后一行单独读入文件时的换行符去掉,但是测试结果仍然存在多了最后一行的情况,但是进行多组测试发现有时出来的结果不存在多一行的情况。六、使用说明运行环境:windows 7,D E V C+使用方法:按照程序上的指示输入相应操作,选择你需要的进行的操作,程序自动执行,接 着 在“货物信息.txt”的文件中输出相应的内容。七、测试结果弹入您要查找的货物遏 蝴 睦 信 息 为:吝式:衣柜颜色:black您皂否要购买此货物?销量:675青选择相去操作:.、查 询 费 杨2、添 加 货 物3、删 除 货 物4、修改货物信息查询用例:数 集7 6 8价格:3991、7E 2、否)17 数据结构与算法设计大作业添加用例:删除用例:r货物信息-记事本文件(F)糠(E)格式(O)百善量桌罩子b l a c k 7 6 3 3 9 9 6 8 0w h i t e 5 4 3 1 9 9 6 5 7p i n k 1 5 0 2 9 9 8 8 0请选择用医操作:1、查 询 赍 物2、添 加 货 物3、删 除 货 物4、修改货物信息埴输入货物的相关信息(名字、颜色、数量、价格、销量):床 pink 398 499 534Process exited after 29.74 seconds with return ualue 0请按任意键继续.三 货物信息-记事本文件(F)编辑(E)格式(。)查 看(V)帮助(I床 p i n k 3 9 8 4 9 9 5 3 4衣柜 b l a c k 7 6 3 3 9 9 6 8 0鞋架 w h i t e 5 4 3 1 9 9 6 5 7桌子 p i n k 1 5 0 2 9 9 8 8 0请选择相关操作:、查询食物 2、添 加 货 物3、删 除 货 物4、修改货物信息3埴输入要删除的货物的名称:床要删除的转物的相关信息为:名字:床颜色:Pink薮量:3 9 8价格:4 9 9销量:534Process exited after 4.969 seconds with return value 0请按任意键继续.信 息-记事本文件(F)编辑(E)格式(O)查看(V)普助(I衣柜 b l a c k 7 6 3 3 9 9 6 8 0鞋架 w h i t e 5 4 3 1 9 9 6 5 7桌子 p i n k 1 5 0 2 9 9 8 8 018 数据结构与算法设计大作业-文件(F)编霸(E)格式(0)查看(V)帮助(H)black 763 399 680white 888 199 657pink 150 299 8800?18aruntimewin64;D:MATLABR2018ab4 1413565788 1547845964 8252421940 FILE=C:UsersAdministrator 1634890867 7499636 1684957559八、附录#include#include#include#includetypedef int datatype;typedef structchar name20;char colour20;int number;int price;int sales;node;/定义结构体,其中信息包含名字、颜色、数量、价 格、19 数据结构与算法设计大作业销量typedef struct Goodsnode goods;struct Goods*next;Jlinklist;/定义单链表,用来连接货物信息Iinklist*head,*p;linklist*CreatList()用尾插法建立单链表,返回表头指针FILE*fp;Iinklist*head,*s,*r;head=(linklist*)malloc(sizeof(linklist);r=head;if(fp=fopen(货物信息.txt“Jr)=NULL)/货物信息录入单链表(printf(HCannot open this file!nn);exit(O);)while(!feof(fp)s=(linklist*)malloc(sizeof(linklist);分配内存空间fscanf(fp,u%s%s%d%d%d*,&s-goods.name,&s-goods.colour,&s-goods.number,&s-goods.price,&s-goods.sales);20 数据结构与算法设计大作业fgetc(fp);将货物信息存入结点数据域r-next=s;r=s;新结点*s插入到尾结点;尾指针r指向新的表尾)r-next=NULL;/将尾结点指针域置空fclose(fp);return head;返回单链表表头)int Search(Iinklist*head)查询货物信息,以及用户是否购买货物(char ch50;int i,n,numl,num2;FILE*fp;linklist*p,*s;printf(请输入您要查找的货物:nH);scanf(%s”,ch);p=(linkIist*)maHoc(sizeof(linkIist);s=(Iinklist*)maIloc(sizeof(Iinklist);p=head-next;for(p=head-next;p!=NULL;)/*查找要查询的货物,从头结点21 数据结构与算法设计大作业开 始 查 询*/if(strcmp(p-goods.name,ch)=0)printf(“该货物的相关信息为:nu);printf(名 字:s颜 色:s数 量:d价 格:d销:%dn*,p-goods.name,p-goods.colour,p-goods.number,p-goods.price,p-goods.sales);/*查找到要查询的货物信息,然后输出其相关信息*/printf(您是否要购买此货物?(1、是 2、否)n);scanf(d”,&i);if(i=l)printf(请输入您要购买的件数:nn);scanf(”d”,&n);numl=p-goods.number;num2=p-goods.sales;/*修 改相应的数量以及销量*/numl=numl-n;num2=num2+n;p-goods.number=numl;p-goods.sales=num2;/*将 修改后的值重新赋给结点数据域*/break;22 数据结构与算法设计大作业)p=p-next;if(p=NULL)/*历遍整个链表仍未查找到要查询的货物信息*/printf(未查找到您要查找的货物!n);)fp=fopen(货物信息.txt Jw);for(s=head-next;s!=NULL;)/*读入文件*/fprintf(fp,%s%s%d%d%dnn,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);s=s-next;)fclose(fp);return 0;int Inser(linklist*head)添加货物(Iinklist*s,*q;FILE*f;23 数据结构与算法设计大作业s=(linklist*)malloc(sizeof(linklist);/*分配存储空间*/s-next=head-next;head-next=s;/*在头结点处插入新结点*/printf(”请输入货物的相关信息(名字、颜色、数量、价格、销量):n);scanf(%s%s%d%d%d*,&s-goods.name,&s-goods.colour,&s-goods.number,&s-goods.price,&s-goods.sales);f=fopen(货 物 信 息 打 开 文 件*/for(s=head-next;s!=NULL;)/*读入文件*/(fprintf(f,n%s%s%d%d%dn*,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);s=s-next;)fclose(f);return 0;)int Delete(linklist*head)删除货物(char ch50;FILE*fp;int flag;24 数据结构与算法设计大作业linklist*p,*r,*s;s=(linklist*)malloc(sizeof(linklist);printf(请输入要删除的货物的名称:nn);scanf(n%sn,ch);r=head;for(p=head-next;p!=NULL;p=p-next)查找要查询的货物,从头结点开始查询if(strcmp(p-goods.name,ch)=0)printf(要删除的货物的相关信息为:n);printf(名字:s 颜色:s 数量:d 价格:%d 销i :%dn*,p-goods.name,p-goods.colour,p-goods.number,p-goods.price,p-goods.sales);/*查找到要查询的货物信息,然后输出其相关信息*/r-next=p-next;在链表中删除结点*pfree(p);释放结点*pflag=l;/*i=l时,查找到需要删除的货物信息*/break;)else flag=2;/*i=2,未查找到*/)25 数据结构与算法设计大作业if(flag=l)fp=fopen(货物信息.txtJw);/*打开文件*/s=head-next;whiIe(s-next!=NULL)/*读入文件*/fprintf(fp,n%s%s%d%d%dnn,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);s=s-next;)fprintf(fp,%s%s%d%d%d*,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);fclose(fp);)if(flag=2)printf(“没有查找到您要删除的货物信息!暧);return 0;)int change(linklist*head)修改货物信息26 数据结构与算法设计大作业int num,i,m,flag;char ch50;linklist*p,*r,*s;FILE*f;printf(“您要修改的信息为:nl、数量 2、价格n);scanf(n%dn,&i);printf(“您要修改的货物信息的名称为:n”);scanf(%s,ch);if(i=l)/*修改数量*/p=(linklist*)malloc(sizeof(Iinklist);/*分配内存空间*/for(p=head-next;p!=NULL;p=p-next)if(strcmp(p-goods.name,ch)=0)/*查找到需要修改的信息*/printf(“您要把值修改为:nn);scanf(%d”,&num);p-goods.number=num;/*修改货物信息*/flag=l;break;else flag=2;27 数据结构与算法设计大作业if(i=2)/*修改价格*/p=(linklist*)malloc(sizeof(Iinklist);/*分配内存空间*/for(p=head-next;p!=NULL;p=p-next)if(strcmp(p-goods.name,ch)=0)/*查找到需要修改的信息*/printf(“您要把值修改为:nn);scanf(%d”,&num);p-goods.price=num;/*修改货物信息*/flag=l;/*flag=l时,需要修改的货物信息存在*/break;)else flag=2;/*flag=2时,需要修改的货物信息不存在*/)f=fopen(货物信息.txt J w);/*打开文件*/if(flag=l)/*将修改后的相关信息读入文件*/s=head-next;/*s 指向头结点*/whi!e(s-next!=NULL)(fprintf(f,u%s%s%d%d%dnM,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);28 数据结构与算法设计大作业s=s-next;)fprintf(f,n%s%s%d%d%d*,s-goods.name,s-goods.colour,s-goods.number,s-goods.price,s-goods.sales);fclose(f);)else if(flag=2)printf(未查找到您要修改的相关货物信息!nn);return 0;)int main。/*主函数*/(int a,b;head=CreatList();/*调用建立链表的函数,将返回值赋给head*/printf(请选择相关操作:nl、查 询 货 物 2、添 加 货 物 3、删除 货 物 4、修改货物信息n”);scanf(n%dn,&a);printf(.n);switch(a)/*选择相应的操作,并调用相应的子函数*/29 数据结构与算法设计大作业case l:Search(head);break;case 2:Inser(head);break;case 3:DeIete(head);break;case 4:change(head);break;return 0;30