数据结构课程设计(通讯录制作).docx

上传人:夺命阿水 文档编号:1114538 上传时间:2024-03-15 格式:DOCX 页数:34 大小:218.93KB
返回 下载 相关 举报
数据结构课程设计(通讯录制作).docx_第1页
第1页 / 共34页
数据结构课程设计(通讯录制作).docx_第2页
第2页 / 共34页
数据结构课程设计(通讯录制作).docx_第3页
第3页 / 共34页
数据结构课程设计(通讯录制作).docx_第4页
第4页 / 共34页
数据结构课程设计(通讯录制作).docx_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《数据结构课程设计(通讯录制作).docx》由会员分享,可在线阅读,更多相关《数据结构课程设计(通讯录制作).docx(34页珍藏版)》请在课桌文档上搜索。

1、设计内容通讯录本系统应完成一下几方面的功能:1)输入信息enter();2)显示信息display();3)查找以姓名作为关键字search();4)删除信息delete();5)存盘save();6)装入load();设计要求:1)每条信息至包含:姓名(NAME)街道(STREET)城市(ClTY)(EIP)国家(STATE)几项2)作为一个完整的系统,应具有友好的界面和较强的容错能力二.设计思路通过visualc+6.0(用的是C语言)编写一个dos界面的控制台程序,该程序通过链表的操作,文件存储来实现通讯录的根本功能structaddress*定义结构*/charname10;*姓名*/

2、charstreet50;*街道*/charcity10;/*城市*/charstate15;/*国家*/chareip7;/*/struct address *next;*后继指针*/*前驱指针*/structaddress*prior;链表的插入,删除来实现通讯录里的内容的插入删除当操作完成通过文件件来存储链表的信息,下次翻开程序时,读取文件里的内容到内存中,放在链表,然后又可以对链表进行操作;在这里面,文件内容不可以在外部更改,只能通过读取到内存链表中,通过程序进行更改,然后再写入到文件,写入过程会覆盖上次的内容。structaddress*start;structaddress*las

3、t;structaddress*find(char*)*首结点*/*尾结点*/;*声明查找函数*/voidenter();/*函数声明*/voidsearch();/*查找,查找过程中调用find函数*/voidsave();/*存盘,将链表信息保存到文件中*/voidIoadO;/*导入,将文件内容导入到内存链表中*/voidlist();/*显示当前链表中信息*/voidddelete(structaddress*,structaddress*);voidinsert(structaddress*i,structaddress*start,structaddress*last);voidi

4、nputs(char*,char*,int);voiddisplay(structaddress*);intmenu_select(void);三.详细设计1.主界面设计通过SWitCh语句调用各种函数,实现各种操作。然后把SWitCh嵌套到无限的for循环(for(;)中,使完成每一步操作都回到到选择操作的主界面函数之间的相互调用E:学习课程设计Debug谑讯录.exe,I:欢迎使用Dom通祖录系统人兴兴XX兴*兴兴XW*i青在做其它操作前先导入*xx*xx*xMMMMMMMMMMMMMMMMXMMM MMMM MMM MMX MMMM MMK MMMMK1 .输入信息2 .删除信息3 .显

5、示信息4 .查找5 .存盘6 .导入7 .退出MMXMXMM MMMM KMM MMMM XM MMMXMM KMKMMMMMMKMMKMMMMMMPleaseenteryourchoice:voidmain()start=last=NULL;for(;)*无限循环*/(switch(menu-select()*调用主界面的选择函数,带回返回值*/(case 1: renter();continue;case 2: ddeletestart,&last);continue;case 3: list();continue;case 4: search();continue;case 5: sav

6、e();continue;case 6: load();continue;case7:exit(0);)*主目录*/intmenu_select(void)(chars80;printfC欢送使用DOS通讯录系统nzz);printf(*请在做其它操作前先导入*n)Printf(*1Printf(*2Printf(*3Printf(*4Printf(*5Printf(*6Printf(*7输入信息*n)删除信息*n)显示信息*n)查找*n)存盘*n)导入*n)退出*n)do(printf(zz11Plaseenteryourchoice:nzz);gets(s);c-atoi(s);*将获取的

7、字符串转换成整型*/while(c7);return c;/*返回输入值*/2.输入信息函数Pleaseenteryourchoice:1输入空姓名结束:请输入 请输入 请输入 请输入 请输入姓名:刘显安街道:江西德安城市:德安国家:中国邮编:123456输入空姓名结束:请输入姓名::欢迎使用DOy通史录系统八MMMMMKMMMMXMMMMMMK息息息MMMMMXKKKKMMKMMMKMMMMMXMMMMMXMMMMXMX共兴XXXXXXXXXi青在做其它操作前先导入共头XXxXX共XXXXXMmxmxmxxmxmmxmmxmmxmxxxmxmxmxxxmxxmxmmmmmxmxxmm输入函数

8、:structaddress*info;/*定义当前结点*/for(;)(info=(structaddress*)malIoc(sizeof(structaddress);*为当前结点分配空间*/if(!info)(printf(z,nOutofmemory);exit(0);*如果分配空间失败,退出程序*/)Printf(输入空姓名结束:n);inputs(请输入姓名:,info-name,10);if(!info-name0)break;*如果输入姓名为空,结束循环*/inputs(请输入街道:,info-street,50);inputs(请输入城市:,info-city,15);in

9、puts(请输入国家:,info-state,15);inputs(请输入:,info-eip,7);insert(info,&start,&last);*调用结点插入函数*/)输入函数调用到另外两个函数,inputs和insert其中inputs中还用到fgets(str,n,fp),把键盘的输入信息传到字符串中charp255;do(printf(prompt);fgets(p,254,stdin);*stdin,标准输入缓存,获取键盘输入信息*/if(strlen(p)count)printf(xznTooLongn);whiIe(strIen(p)count);pstrlen(p)-l

10、-0;strcpy(s,p);insert是关键函数,每当输入完一条信息都会调用到insert函数,将信息插入到链表中if(*last=NULL)/*如果尾结点为空,意味着当前链表为空*/*那么将该结点赋给头尾结点*/i-next=NULL;i-prior=NULL;*last=i;*start=;return;else*如果链表不为空,那么将信息插入到链表尾,作为尾结点*/(*last)-next=i;i-prior=*last;i-next=NULL;*last-(*last)-next;easeenteryourcnoce邮编43830023456712356123456家国国国国国中中

11、中中市城庄阳安城麻枣阜德城庄阳安 麻枣阜德 道北东徽西 街湖山安江强坡安 名志尚林显 姓吴杨王刘 插入信息会显示在链表最后enter yourchoice强坡安林 名志尚林显建 3姓吴杨王刘黄城庄阳安州 麻枣阜德抚 道北东徽西西 街湖山安江江市城庄阳安州城麻枣阜德抚家国国国国国 Elcb( Cb邮编4383 234567 1234561234563456233.删除查找显示函数删除函数调用find函数,通过姓名,查找到该节点,然后删除该节点信息,这其中涉及到头尾节点,及其变化;先判断是否为头结点,如果为头结点,那么把原头结点的后继作为新的头结点如果不为头结点,那么该节点的前驱的next指向该节

12、点的后继如果该节点为尾结点,那么让该节点的前驱作为新的尾结点structaddress*info;chars80;inputs(请输入姓名:”,s,10);info=find(s);if(info)(printf(z,Deletingn);if(*start=info)*start=info-next;if(*start)(*start)-prior=NULL;elseinfo-prior-next=info-next;if(info!=*last)info-next-prior=info-prior;else*last=info-prior;free(info);printf(zz-0k,删

13、除成功!n);)与删除相比,查找就简单的多,只需要调用find的函数,找到该节点记录并显示出来就行了,在SearCh本身里面只要调整下输出的界面就行了structaddress*find(char*name)/*查找函数,形参为欲查找结点的name域*/(structaddress*info;info=start;while(info)(if(Istrcmp(name,info-name)returninfo;info=info-next;)printf(zNamenotfound.n);returnNULL;IPleaseenteryourchoice:2请输入姓名:王林Deleting-0

14、。删除成功,:欢迎使用D0?通奥录系统人WWXXxxWXxXXXi青在做其它操作前先导入XXXXXXWXW兴XXXMMMMMMMXMXMMMMXMXMXMMMMMXXMMMMMMMMXMMMXmmmmmmmxmmmmmmmm MKKKXMMMKMMMMMMX MXMXMMMMMMMXMXXX MMM MM MMMM1 .输入信息2 .删除信息3 .显示信息4 .查找5 .存盘6 .导入7 .退出XMKMKMMMMXM MMMMMXMMMMMMMMMMM MMMMMXMMMXMKMM MMMMXXXXXXMXMMM MMM KMMMPleaseenteryourchoice:需输入要查找的姓名:

15、吴志强吴志强湖北麻城麻城中国438300:欢迎使用DOS通近录系统八XXXXXxXXXXXX请在做其它操作前先导入XXXXXxXXXXXXXMMKMX*兴兴兴兴兴兴XX兴兴兴XXXX.输入信息兴兴兴兴兴兴兴兴兴兴兴兴*兴兴兴兴兴输出函数更简单,直接输出链表即可if(infO=NULDPrintf(当前记录为空!);elseprintf(姓名t街道tt城市t国家ttnzz);while(info)(display(info);/*display为输出节点函数,一些列Print组成*/if(info-next=NULL)break;info=info-next;);XMMMMXMMMMKKKKKK

16、3 .显示信息4 .5 .存盘6 .7 .退出MMMMMMMMMMMMMKKKMMMenteryourchoice:强坡安林 名志尚林显建 3姓吴杨王刘黄城庄阳安州 麻枣阜德抚 道北东徽西西 街湖山安江江市城庄阳安州城麻枣阜德抚家国国国国国国中中中中中邮编4383002345671234561234563456234.存储与导入存储存储时通过f。Pen翻开文件(没有该文件时那么创立)fp=fopen(z,record.txt,wb);/*生成文件*/if(!fp)printf(,zCannotopenfile,nz,);return)然后通过fwrite将链表信息写入文件while(info)

17、/*把链表写入文件*/fwrite(info,sizeof(structaddress),1,fp);info=info-next;fwrite每次从info读取一个sizeof(structaddress)长度的数据,写入fp文件中。写入完毕后即关闭文件fclose(fp);导入导入时先建立链表,为节点分配内存空间然后翻开文件,将文件的内容写入内存链表中registerintt,size;structaddress*info,*temp=0;char*p;FILE*fp;*翻开文件*/if(fp=fopen(record.txt,r)=NULL)(Printf(Cannotopenfile!

18、n);return;)printfC,1111Loading.nz,);*调用文件*/size=sizeof(structaddress);*为结点分配内存*/start=(structaddress*)malIoc(size);if(!start)*如果读取失败,返回*/(printf(z,0utofmemory!n);exit(O);)info=start;P二(Char*)info;whiIe(*p+=getc(fp)!=EOF)(for(t=0;tnext=(structaddress*)malloc(size);if(!info-next)Printf(Outofmemory!n7z

19、);return;info-prior=temp;temp=info;info-info-next;P=(char*)info;temp-next=O;last=temp;start-prior=0;fclose(fp);注意:每次文件存储的时候都会覆盖以前存在文件里的内容,而每次导入的时候都会改变链表的内容。因此每次翻开程序时请先导入存储在文件里的数据,或者将record.txt备份存储起来,防止数据丧失。通过本次课程设计,我学到了很多东西。以前从没有用过文件方面的知识,而这次设计中用到了,刚开始使用时出了很多问题,在文件存储时经常遇到意外错误而导致程序终止了。这次的实验使我对结构体,链表的

20、认识更深刻,使用更熟练,刚开始时在链表插入时遇到好屡次内存方面的错误,还有插入操作时对指针的使用不太熟练。通过一次次的思考与实验,思路更加清晰,程序的容错能力也越来越强。这次实验让我学到很多书本上没有的东西。程序里屡次用到for(;)循环,还有(StrUCtaddress*)malloc(sizeof(structaddress)为节点分配内存空间。在文件操作中主要涉及到的函数有:fopenL文件名”J使用文件方式”);fwrite(info,sizeof(structaddress),1,fp);fclose(文件指针);五.参考资料C程序设计第三版)谭浩强清华大学出版社数据结构(C+版)李

21、根强中国水利水电出版社附完整源码:#include#include#include定义结构*/structaddresscharname10;charstreet50;charcity1O;charstate15;chareip7;struct address *nxt;后继指针*/struct address *prior;Z*前驱指针7;struct address *start;首结点*/struct address *last;*尾结点7声明查找函数*/structaddress*find(char*);voidenter();*函数声明7voidsearch();voidsave()

22、;voidload();voidlist();voidddelete(structaddress*start,structaddress*last);voidinsert(structaddress*i,structaddress*start,structaddress*last);voidinpus(char*,char*,int);voiddisplay(structaddress*);intmenu.selct(void);voidmain()start=last=NULL;for(;)(switch(menu_select()(case1:enter();ntinue;case2:dd

23、elete(&starty&last);ntinue;case3:list();ntinue;case4:search();ntinue;case5:save();ntinue;case6:load();ntinue;case7:exit(0);)intmenu_select(void)*主目录*/printf(wA欢送使PrintfL* 请在做其chars80;intc;用DOS通讯录系统An);它操作前先导入*f*n“);printf(*n);Printf(W*1输入信息*.PrintfCMr*2JM除信息*A.).*) PHnV*3显示信息*m*y.).printf(ww*4.查找pri

24、ntf(tt*5.存盘printf(,6.导入*) m*.*y).printf(tt*7.退出pA口行c*w*jn)doprintf(nPleaseenteryourchoice:n);gts(s);c=atoi(s);while(c7);return c;void nter()*返回输入值*/厂输入函数,本函数循环输入资料,当输入姓名为空时退出*/structaddress*info;/*定义当前结点7for(;)(info=(structaddress*)mall(sizeof(structaddress);/*为当前结点分配空间*/if(!info)printf(nOutofmemory

25、);exit(O);如果分配空间失败,退出程序*/Printfc输入空姓名结束:Vr);inputs(”请输入姓名:*infoname,10);if(!info-nam0)break;如果输入姓名为空,结束循环*/inputs,请输入街道:*infostreet,50);inputs(请输入城市:*infocity,15);inputS(N请输入国家:*infostate,15);InPUtS(N请泊人:,infteip,7);insert(info,&start,&last);/*调用结点插入函数*/)voidinputs(char*prompt,char*s,intunt)/*输入函数,有

26、越界检溜功能*/(charp255;do(printf(prompt);fgets(p,254,stdin);if(strien(p)unt)printf(nTooLongnw);while(strien(p)unt);pstr1en(p)-1=0;strcpy(s,p);void insert(数据插入函数*/structaddress*i,structaddress*start,structaddress*lastif(*last=NULL)如果尾结点为空,意味着当前链表为空*/(i-next=NULL;i-prior=NULL;*last=i;*start=i;return;)else(

27、*last)-nxt=i;i-prior=*last;i-nxt=NULL;*last=(*last)-next;)voidddelete(structaddress*start,structaddress*last)*除函数*/(structaddress*info;chars80;inputs(”请输入姓名:,s,10);输入欲删除结点的name域内容7info=find(s);查找该内容7if(info)/*如果找到*/(printf(Deletingn);if(*start=info)/*如果该结点为首结点,把该结点的下驱作为新的首结点(入口)*/*start=info-next;if

28、(*start)(*start)-prior=NULL;elsewIast=NULL;)else如果欲删除的结点不是首结点7(info-prior-next=info-next;令该结点的前驱的next指针指向该结点的后驱,*又令该结点的后驱的Prior指点指向该结点的前驱*/if(info!=*last)/*如果该结点是尾结点,那么令该结点的前驱为尾结点/info-next-prior=info-prior;else*last=info-prior;freinfo);/*释放该结点所占用的内存7PrintfrQk,除成功NT);)structaddress*find(char*name)/*

29、查找函数,形弁为欲查找结点的name域7(structaddress*info;info=start;while(info)if(!strcmp(name,info-name)retuminfo;info=info-next;)Printf(未找到相关信息r);returnNULL;)/*输出整个雒表7voidIist(Void)(structaddress*info;info=start;if(info=NULL)Printf(当前记录为空门;elsePrintf(姓名V街三W城前国家ttn);while(info)(display(info);if(info-next=NULL)break

30、;info=info-next;);printf(,nn);voiddisplay(structaddress*info)厂输出传入结点函数*/printf(M%stM,info-name);printf(w%stw,info-stret);printf(,%stn,info-city);printf(M%stM,info-state);printf(M%stM,info-eip);PrintfCAn);void search(void)*查找函数*/charname40;structaddress*info;Printf(请输入要查找的姓名:);/*输入欲查找的姓名7gets(name);i

31、nfo=find(name);If(Hnfo)Printfc姓名不存在n);/*如果没找到,显示Notfound*/elsedisplay(info);/*如果找到,显示该结点资料*/)voidsave(void)/*保存函数*/(structaddress*info;FILE*fp;fp=fopen(HrTOord.txf,wbM);生成文件7W(printf(Cannotopenfilenw);return;)PrintffAnSaveingn);info=start;while(info)把鞋表写入文件7(fwrite(info,sizeof(structaddress),1,fp);i

32、nfo=info-next;)printf(-ok!n);fdose(fp);/*健表全部写入文件后,关闭文件7)voidload()调用预存文件函数*/registerinttlsize;structaddress*info,*temp=0;char*p;FILE*fp;/*!开文件*/if(fp=fopenCrerd.txt,r)=NULL)(printf(Cannotopenfile!n);return;)printf(nnLoading.n);调用文件7size=sizeof(structaddress);*为结点分配内存*/start=(structaddress*)mall(size);if(!start)*如果读取失败,返回*/printf(Outofmemory!n);exit(0);)info=start;p=(char*)info;whil(*p+=getc(fp)!=EOF)(for(t=0;tnext=(structaddress*)malloc(siz);if(!info-nxt)(printf(wOutofmmory!n);return;)info-prior=temp;temp=info;info=info-next;p=(char*)info;)temp-next=O;last=temp;start-prior=0;fdose(fp);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号