链表的维护与文件形式的保存.docx
- 文档编号:12705573
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:18
- 大小:59.95KB
链表的维护与文件形式的保存.docx
《链表的维护与文件形式的保存.docx》由会员分享,可在线阅读,更多相关《链表的维护与文件形式的保存.docx(18页珍藏版)》请在冰豆网上搜索。
链表的维护与文件形式的保存
《数据结构与算法》课程设计报告
姓名:
学号:
专业:
信息与计算科学
一、课题:
链表的维护与文件形式的保存
以有序链表结构表示某家电商场的库存模型。
提/进货时,需对链表进行维护。
每个工作日结束后,应将该链表以文件形式保存;每日营业前,应从文件中恢复该有序链表结构。
链表接点的数据域包括家电名称,品牌,单价和数量,以单价的升序体现链表的有序性。
程序包括:
初始化,创建表,插入,删除,更新数据,查询及链表数据与文件之间的转换等;
二、功能、算法、体会描述:
系统主要有两个界面,第一个界面是查看界面,任何人可以查看到多个库存或日志文件(050902--050905),如果某个库存文件丢失了,可以通过操作恢复,在这也可以也可以查看到某日的金额统计情况,第二个界面是操作界面,只有操作员可以通过密码进入,可以对某个指定的库存文件进行进货,提货,删货,排序,查询操作,操作的情况可以被系统随时保存,当您想退出此界面时可保存库存和日志情况,文件名可自定,保存完后,自动退回到第一个界面,您当然就可以在查看界面中查看到您刚刚保存的库存或者日志文件了。
1.库存查看功能:
基本思想:
利用SetupGoodsList()函数,将库存文件内容先转成链表形式,然后利用TraverseList()函数,遍历一个链表,就可以直接显示查看到了。
具体步骤:
先将文件读到结构体中,读满一个结构体内容就将此结构体连到定义好的链表上,这儿利用了InsertRear()函数,一直这样读下去只到文件里读不到内容为止,语句描述如下:
while(ifstr>>g.code)
{
ifstr>>g.name>>g.mark>>g.minq>>g.curq;
InsertRear(L,g);
}
2.日志查看功能:
日志文件的内容看起来跟库存文件差不多,但是里面多了个“操作情况”这一览,所以
在读的时候要注意这一点,实现这个功能的我编了rizhichakan()函数
基本思想:
将文件内容独到结构体数组中,然后再显示出来
具体步骤:
先读一个字符串到数组d[]中,然后用strcmp(),判断是不是“j”字符串,如果是就连读5个字符串到定义好的结构体数组中,因为这句话是放在while()循环里的,要能够的起循环就要不断的给d[]赋新值,所以循环语句中还有一句:
再读第6个字符串到d[]中,只要符合循环条件的都会被连续加到结构体数组中,
语句描述为:
ifstr>>d;//因为是比较两个字符串所以要一个数组
while(strcmp(d,"j")==0)
{
ifstr>>r[x].code>>r[x].name>>r[x].mark>>r[x].minq>>r[x].curq;
ifstr>>d[0];//数组赋不起来,所以改成了元素
x++;
}
其它以“t”“s”开头的也同样的道理,这样就将处了开头的“j”“t”“s”字符以外的信息内容全分别存到三个结构体数组中,这样往外显示的时候可以更清楚方便准确,然后就到用for()语句循环的将结构体内容显示了,语句描述为:
for(p=1;p { cout< cout< 体会: 在这懂了strcmp()是比较两个字符串的,不是单纯的字符,对while()循环有了更深刻的理解,明白了文件的内容要经过一个中间环节,才能够显示,这儿的中间环节就是结构体数组。 3系统恢复功能: 功能: 可利用前一天的库存文件和当天的日志文件进行恢复,定义了huifu()函数 算法思想: 首先将日志文件内容切成结构体形式,再将库存文件内容转成链表形式 利用update()函数,将库存链表更新,然后将更新好的链表保存到文件中。 具体步骤: 将日志文件切成三个结构体数组的过程已经在“日志查看功能”中描述了,库存文件转成链表形式也在“库存查看功能”中描述了,但这有个非常重要的东西要说明一下,因为日志文件的最后一览显示的是“操作量”也就是商品参与操作的变化量,如果直接拿去更新原来库存中的链表,那结果是错误的,要实现能将前一天库存文件的商品“数量”与当天日志文件商品的“操作量”整合一下,然后得到当天库存文件的数量,这是个非常关键的东西。 我是这样来实现的: 利用Find()函数,通过日志文件的商品条形码在库存中找到对应的结构体,Find()函数的关键语句描述如下: while(p! =NULL) if(strcmp(p->data.code,item.code)==0) { item=p->data;//结构体赋值 return1; } else p=p->next;//遍列查找 然后再将日志文件的商品“操作量”与前一天库存文件的商品“数量”整合,最后将整合好的结构体去更新一下前一天库存文件这条链表,对于新货直接接到库存文件链表尾部就可以了,对于删货的情况可以直接在链表中删掉结构体,细分一下有4种情况,语句描述如下: for(p=1;p { m=r[p].curq; if(Find(L2,r[p]))//旧货添加 { r[p].curq+=m; Update(L2,r[p]); } elseInsertRear(L2,r[p]);//新货插入 } for(q=1;q { n=s[q].curq; Find(L2,s[q]); s[q].curq-=n;//旧货减少 Update(L2,s[q]); } for(v=1;v Delete(L2,t[v]);//旧货删除 体会: 这个功能的算法思想比较重要,充分利用了几个简单函数的功能,大有“几个臭皮匠顶过诸葛亮”的意味,所以在这我更深的理解了“不可轻视”这个词! 这个函数功能基本上是比较全面的结合了其它功能项,我也是在做其它功能的时候慢慢的有了做这个功能的信心的,一开始觉得很难很难,其实弄透了一些东西,很多事都可以去做,“只要功夫深,铁锄磨成针”, 虽然老师提到的“用户权限文件”和“产品名目文件”还有利用模式匹配实现模糊查询,“分类汇总”等我没有去做,但相信只要自己去专心研究一翻,自然可以取的成果! 人生真的很美妙,有句话叫“没有做不到,只有想不到”,从课程设计中体会人生真是件乐事,我对自己说: “年轻人应该去想想自己本不该想的事情,年轻有什么不可以呢! ” 4.金额统计功能: 算法思想很简单: 编了rizhitongji()函数,将日志文件内容切成结构体形式,将结构体中的单价和操作量相乘赋到几个变量里就可以了。 主要步骤: 将日志文件切成三个结构体数组的过程已经在“日志查看功能”中描述了, 变量赋值就举一例语句如下: for(p=1;p e+=(r[p].minq)*(r[p].curq); 体会: 这个函数功能简单,但是还是非常必要的,这样可以让用户快截准确的知道某天的财务状况。 不能说事情简单就不去做,简单的事情作好了,并且勇于挑战更高的目标,才是积极的态度。 5.查询功能: 功能: 编了search()函数,这是个分类查询,提供了5种查询方式,只要您给出商品的某条信息,此函数就可以帮您在库存中找到有关该信息的所以商品信息。 算法思想: 重点利用了一个结构体数组,只要符合查找信息的机构体都可以加进来,关键代码如下 cin>>item.code; while(p! =NULL) if(strcmp(p->data.code,item.code)==0)//只要符合条件的都可加进结构体中去 { q[j]=p->data; j++; p=p->next; } else p=p->next;//遍列查找 最后显示结构体数组内容就可以了,关键代码如下 for(intk=1;k cout< 体会: 这个功能做的非常不够,语句长但都是一个道理,没什么意思,以后有时间我可以尝试老师说的“模糊查询”,或者将现在的语句改的更精练一些! 6.进货,提货,删货功能: A.进货、提货 算法: 利用Find()函数,先通过条行码查找到对应的结构体,当然也可以通过家电名称等查找,然后将要加或者要减的商品量在找到的结构体表示数量的元素上加减掉,然后将此结构体参与更新一下链表即可;关键代码如下(这儿只举加的例子): cin>>g.code; if(Find(L1,g)) { cout<<"请您输入进货商品的量: "; cin>>m; g.curq+=m;//直接加到现有库存上 Update(L1,g); } 对于新进的商品要特别对待,应该将已建立好的结构体的其它内容填充好,然后利用 InsertRear()函数将此结构体尾插到链表上;关键代码如下: cout<<"请您输入新进货商品其余字段内容: ";//找不到就尾插 cin>>g.name>>g.mark>>g.minq>>g.curq; InsertRear(L1,g); 如果提货的商品不存在,要另外显示一下。 B.删货情况: 算法: 利用Find()函数,先通过条行码查找到对应的结构体,然后利用Delete()函数从库存链表中删掉,对于Delete()函数,重点利用了两个指针ap,cp,跟Find()函数一样,先查找到,然后分不同情况考虑怎样删,具体语句如下: LNode*cp=HL; LNode*ap=NULL; while(cp! =NULL) if(strcmp(cp->data.code,item.code)==0) break; else { ap=cp; cp=cp->next;//ap始终在cp的后面 }//查找 if(cp==NULL) { cerr<<"deletedelementerror! "; return0; }//相对insert多加一个判断 if(ap==NULL) HL=HL->next; else ap->next=cp->next;//删头删后方法不一样 deletecp; 体会: 这是商品管理的基本功能,一开始我漏了删货这个功能,以为提完了,数量剩个0就可以了,其实那样看起来一点不直观,所以“程序是改出来的”这句话一点没错,越改越精,以后我也要继续改这个程序,提高程序的正确性,可读性,健壮性,效率与低存储量需求,好好研究<<数据结构>>这门课! 7.排序功能: 功能: 由于时间的关系,这儿只设了一种按单价的升序排序这一功能 算法如下: 用了Sort()函数,但Sort()函数主要又套用了Insert()函数实现的,Insert()函数用了ap和cp两个指指针,将传过来的元素插到两指针之间,插到比它大最小的元素的前面,Sort()函数用了p和cp两个指针,不断的将数据往Insert()函数送,这儿有必要将两个函数 语句展示出来: Sort()函数,语句如下: LNode*cp=HL; LNode*p=cp; HL=NULL; while(cp! =NULL) { p=cp; Insert(HL,cp->data); cp=p->next; deletep;//cp参与排序,p控制cp一直向前指 } Insert()函数,关键语句如下: newptr->data=item; LNode*cp=HL; LNode*ap=NULL; while(cp! =NULL) if(item.minq break; else { ap=cp; cp=cp->next;//ap始终在cp的后面 } if(ap==NULL) { newptr->next=HL; HL=newptr;//头插情形 } else { newptr->next=cp; ap->next=newptr;//插在ap和cp之间,语句顺序不能错 } 体会: Sort()函数和Insert()函数,都属于基本函数,这些基本函数功能直接,利用起来方便但里面的设计思想并不简单,非常值的学习,这次程序设计我自身也弄清楚了一些基本函数的具体原理,非常难能可贵! 8.保存功能; A.库存文件的保存: 算法思想是: 利用了WriteGoodsFile()函数,先将链表切成结构体,然后将结构体输出到文件 具体步骤是: 利用ListLength()函数将测出链表中结构体的数目,语句如下: LNode*p=HL; inti=0; while(p! =NULL) { i++; p=p->next; } returni; 然后利用一个for()语句和GetElem()函数一个一个得到结构体,GetElem()的关键语句如下: LNode*p=HL; inti=0; while(p! =NULL) { i++; if(i==pos)break; p=p->next; }//循环查找 if(p! =NULL) returnp->data; else { cerr<<"posisoutofrange! "; exit (1); }//对p进行判断,返回查找结果 一边得到结构体一边将结构体内容读到文件中去,整个过程语句如下: intn=ListLength(L);//得到结构体的数目 for(inti=1;i<=n;i++) { g=GetElem(L,i);//循环的输出n个结构体 ofstr< } B.日志文件的保存: 编了rizhibaocun()函数,这儿重点讲一下在当日操作时,三个结构体数组是怎样产生的,特别是结构体数组元素中,“操作量”是怎样得到的,巧妙利用了在进货,提货,删货的过程中有当找到了某个结构体时,立马将该结构体放到准备好的结构体数组中,对于进旧货和提货的情况直接将操作量赋给结构体数组元素的“数量”元素,这样表面看上去还是原来的结构体,实际里面数值变了,在显示的时候只要将最后“数量”一览,变成“操作量”就可以了,所以这样就省去了重新定义一个结构体,而且再以后的日志文件的显示和系统恢复功能里都可以方便一些! 具体的语句是: if(Find(L1,g)) { cout<<"请您输入进货商品的量: "; cin>>m; g.curq+=m;//直接加到现有库存上 r[x]=g;//进货情况随时存起来 r[x].curq=m; x++; Update(L1,g); } else { cout<<"请您输入新进货商品其余字段内容: ";//找不到就尾插 cin>>g.name>>g.mark>>g.minq>>g.curq; r[x]=g;//进货情况随时存起来 x++; InsertRear(L1,g); } if(Find(L1,g)) { cout<<"请您输入提货的商品量: "; cin>>n; g.curq-=n;//直接在现有库存上减掉 s[y]=g;//提货情况存起来 s[y].curq=n; y++; Update(L1,g); TraverseList(L1); } Find(L1,g);//方便记录才设了这三句,否则不要 t[z]=g; z++; Delete(L1,g);//删货情况直接去掉 有了结构体数组那日志文件的保存就进了一大步,以下的过程跟库存文件保存的最后一步一样,只不过多了个for()循环和多加句写入个标志字母, 具体语句如下(只举个进货情况): for(p=1;p { ofstr< ofstr< } 体会: 抓住一瞬间的好机会,可以省去好多力气,些许花了很多力气也不能得到那么好的效果,在以后的编程过程中我要留心这一点,抓住一些得到信息的简单方便的机会,省时省力,编程才会更有效率。 程序结构: Main()函数包括8大函数,图形显示如下: Traverselist();ClearList(); setupGoodList();rizhichakan(); Main() Caozuo();rizhitongji(); help();huifu(); main()函数中caozuo()函数也包括11个函数,caozuo()函数中的sort()函数又包括1个函数,caozuo()函数中的writeGoodsFile()函数也包括2个函数,图形显示如下 InitList();setupGoodList();Find();Update(); rizhibaocun();InsertRear(); GetElem();caozuo(); WriteGoodsFile();Delete(); ListLength();Search();Sort();Traverselist(); Insert(); main()函数中的huifu()函数也包括7个函数,图形显示如下: SetupGoodsList();Find(); InitList();Update(); huifu() WriteGoodsFile();InsertRear(); Delete(); 数据显示: 这儿只显示一下“系统恢复”功能,其它功能用户可以自行调试查看 **************商品管理系统**************** *欢迎进入查看界面,请您根据提示输入,谢谢! * *1.库存查看* *2.日志查看* *3.商品操作* *4.导航阅读* *5.系统恢复* *6.金额统计* *7.退出查看* ************************************ 请您输入选择: 5 请您根据提示输入,我将帮您恢复丢失的库存文件! 请您输入当日日志文件名(如r050904.dat): r050904.dat 请输入其前一天的库存文件名(如ku050904.dat): ku050903.dat 请输入丢失的库存文件名(如ku050904.dat): ku050904.dat 已恢复,您可在查看界面中查看到! **************商品管理系统**************** *欢迎进入查看界面,请您根据提示输入,谢谢! * *1.库存查看* *2.日志查看* *3.商品操作* *4.导航阅读* *5.系统恢复* *6.金额统计* *7.退出查看* ************************************ 请您输入选择: 1 请您输入您要查看的库存文件名(如ku050904.dat): ku050904.dat 您要查看的库存文件为: ------------------------------------------------------------------ 条形码家电名称产家品牌单价数量 110binxianghai'er1200545 122xinxiangaiguozhe2000331 128kongtiaochuanlan2100110 127dianshichanghong2300196 128xiyijixiaotian'e532202 115yinshuijibeibei134563 117weibolugelanshi52078 111huoguogelanshi367156 113dianfanbaochanghong435702 123dianhuajibubugao12030 125chuifenjixiongmao7050 120diandengshengzhou3078 129diannaoshengzhou4880388 124redekuaigelanshi2056 126yundouxiongmao12030 ------------------------------------------------------------------ 与原来的库存文件比较一下: 110binxianghai'er1200545 122xinxiangaiguozhe2000331 128kongtiaochuanlan2100110 127dianshichanghong2300196 128xiyijixiaotian'e532202 115yinshuijibeibei134563 117weibolugelanshi52078 111huoguogelanshi367156 113dianfanbaochanghong435702 123dianhuajibubugao12030 125chuifenjixiongmao7050 120diandengshengzhou3078 129diannaoshengzhou4880388 124r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 维护 文件 形式 保存