设计内容(通讯录)_第1页
设计内容(通讯录)_第2页
设计内容(通讯录)_第3页
设计内容(通讯录)_第4页
设计内容(通讯录)_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、ctaddress/*定义结构*/charname10;/*姓名*/charstreet50;/*街道*/来源网络,仅供参考charstreet50;/*街道*/来源网络,仅供参考ehareity10;/*城市*/eharstate15;/*国家*/ehareip7;/*邮编*/struetaddress*next;/*后继指针*/struetaddress*prior;/*前驱指针*/链表的插入,删除来实现通讯录里的内容的插入删除当操作完成通过文件件来存储链表的信息,下次打开程序时,读取文件里的内容到内存中,放在链表,然后又可以对链表进行操作;存储内存链表彳文件内存链表彳文件在这里面,文件内

3、容不可以在外部更改,只能通过读取到内存链表中,通过程struetaddress*last;/*尾结点*struetaddress*last;/*尾结点*/structaddress*find(char*);/*声明查找函数*/voidenter();structaddress*find(char*);/*声明查找函数*/voidenter();voidseareh();voidsave();/*函数声明*/*查找,查找过程中调用find函数*/*存盘,将链表信息保存到文件中*/voidload();/*导入,将文件内容导入到内存链表中*/voidload();/*导入,将文件内容导入到内存链表

4、中*/voidddelete(structaddress*,structaddress*);voidinsert(structaddress*i,structaddress*start,structaddress*last);voidinputs(char*,char*,int);voiddisplay(structaddress*);intmenu_select(void);三.详细设计主界面设计通过switch语句调用各种函数,实现各种操作。然后把switch嵌套到无限的for循环(for(;)中,使完成每一步操作都回到到选择操作的主界面函数之间的相互调用voidmain()start二l

5、ast二NULL;for(;)/*无限循环*/switch(menu_select()/*调用主界面的选择函数,带回返回值*/case1:enter();continue;case2:ddelete(&start,&last);continue;case3:list();continue;case4:search();continue;case5:save();continue;case6:load();continue;i_s,chars80;intc;printf(八欢迎使用DOS通讯录系统八n);printf(“*请在做其它操作前先导入*n);printf(*n);printf(*1.输

6、入信息*n);printf(*2.删除信息*n);来源网络,仅供参考printf(*printf(*3.显示信息*n);printf(*printf(*3.显示信息*n);来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考printf(*4.查找printf(*5.存盘*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*iI1Jprintf(*6.导入*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*iI1Jprintf(*7.退出*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*iI1Jprintf(

7、*n);doprintf(nPleaseenteryourchoice:n);gets(s);c=atoi(s);/*将获取的字符串转换成整型*/while(c7);returnc;/*返回输入值*/输入信息函数输入函数:structaddress*info;/*定义当前结点*/for(;)/*为当前结点分配空间info=(structaddress*)malloc(sizeof(structaddress);/*为当前结点分配空间*/if(!info)来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考printf(nOutofmemory);exit(0);退出程序*/

8、*如果分配空间失败,printf(输入空姓名结束:n);inputs(“请输入姓名:,info-name,10);if(!info-nameO)break;结束循环*/*如果输入姓名为空,inputs(请输入街道:,info-street,50);inputs(请输入城市:,info-city,15);inputs(请输入国家:,info-state,15);inputs(请输入邮编:,info-eip,7);insert(info,&start,&last);/*调用结点插入函数*/输入函数调用到另外两个函数,inputs和insert其中inputs中还用到fgets(str,n,fp),

9、把键盘的输入信息传到字符串中charp255;doprintf(prompt);fgets(p,254,stdin);fgets(p,254,stdin);/*stdin,标准输入缓存,获取键盘输入信息*/fgets(p,254,stdin);fgets(p,254,stdin);/*stdin,标准输入缓存,获取键盘输入信息*/来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考if(strlen(p)count)printf(nTooLongn);while(strlen(p)count);pstrlen(p)-1=0;strcpy(s,p);insert是关键函数,每

10、当输入完一条信息都会调用到insert函数,将信息插入到链表中if(*last=NULL)/*如果尾结点为空,意味着当前链表为空*/*则将该结点赋给头尾结点*/i-next二NULL;i-prior二NULL;*last二i;*start二i;return;else/*如果链表不为空,则将信息插入到链表尾,作为尾结点*/(*last)-next=i;i-prior=*last;来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考i-next=NULL;*last=(*last)-next;删除査找显示函数删除函数调用find函数,通过姓名,查找到该节点,然后删除该节点信息,

11、这其中涉及到头尾节点,及其变化;先判断是否为头结点,如果为头结点,则把原头结点的后继作为新的头结点如果不为头结点,则该节点的前驱的next指向该节点的后继如果该节点为尾结点,则让该节点的前驱作为新的尾结点struetaddress*info;chars80;inputs(请输入姓名:,s,10);info=find(s);if(info)printf(Deletingn);if(*start=info)*start=info-next;if(*start)(*start)-prior=NULL;else*last=NULL;elseinfo-prior-next二info-next;if(in

12、fo!=*last)info-next-prior二info-prior;else*lasor;free(info);printf(-Ok,删除成功!n);与删除相比,查找就简单的多,只需要调用find的函数,找到该节点记录并显示出来就行了,在search本身里面只要调整下输出的界面就行了structaddress*find(char*name)/*查找函数,形参为欲查找结点的name域*/structaddress*info;info=start;while(info)if(!strcmp(name,info-name)returninfo;printf(Namenotfound.n);re

13、turnNULL;输出函数更简单,直接输出链表即可if(info=NULL)printf(当前记录为空!);elseprintf(姓名t街道tt城市t国家t邮编tn);while(info)display(info);/*display为输出节点函数,一些列print组成*/if(info-next=NULL)break;info=info-next;存储与导入存储存储时通过fopen打开文件(没有该文件时则创建)fp=fopen(record.txt,wb);/*生成文件*/if(!fp)printf(Cannotopenfile.n);return然后通过fwrite将链表信息写入文件wh

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

15、topenfile!n);return;printf(nnLoading.n);/*调用文件*/size=sizeof(structaddress);/*为结点分配内存*/start=(structaddress*)malloc(size);if(!start)/*如果读取失败,返回*/printf(Outofmemory!n);exit(0);info=start;p=(char*)info;while(*p+=getc(fp)!=EOF)s+”)*p+=getc(fp);info-next=(structaddress*)malloc(size)if(printf(Outofmemory!

16、n);info-prior二temp;temp二info;info=info-next;p=(char*)info;temp-next=0;last=temp;start-prior=0;来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考fclose(fp);注意:每次文件存储的时候都会覆盖以前存在文件里的内容,而每次导入的时候都会改变链表的内容。因此每次打开程序时请先导入存储在文件里的数据,或者将record.txt备份存储起来,避免数据丢失。通过本次课程设计,我学到了很多东西。以前从没有用过文件方面的知识,而这次设计中用到了,刚开始使用时出了很多问题

17、,在文件存储时经常遇到意外错误而导致程序终止了。这次的实验使我对结构体,链表的认识更深刻,使用更熟练,刚开始时在链表插入时遇到好多次内存方面的错误,还有插入操作时对指针的使用不太熟练。通过一次次的思考与实验,思路更加清晰,程序的容错能力也越来越强。这次实验让我学到很多书本上没有的东西。程序里多次用到for(;)循环,还有(structaddress*)malloc(sizeof(structaddress)为节点分配内存空间。在文件操作中主要涉及到的函数有:fopen(”文件名”,”使用文件方式”);fwrite(info,sizeof(structaddress),1,fp);fclose(

18、文件指针);五参考资料C程序设计(第三版)谭浩强清华大学出版社数据结构(C+版)李根强中国水利水电出版社附完整源码:#include#include#includestructaddress/*structaddress/*定义结构*/charname10;charstreet50;charcity10;charstate15;chareip7;structaddress*next;structaddress*next;/*后继指针*/structaddress*next;structaddress*next;/*后继指针*/来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供

19、参考structaddress*prior;/*前驱指针*/;structaddress*start;/*首结点*/structaddress*last;/*尾结点*/structaddress*find(char*);/*声明査找函数*/voidenterQ;/*函数声明*/voidsearch。;voidsave();voidload。;voidlist。;voidddelete(structaddress*start,structaddress*last);voidinsert(structaddress*i,structaddress*start,structaddress*last)

20、;voidinputs(char*,char*,int);来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考voiddisplay(structaddress*);intmenu_select(void);voidmain()start=last=NULL;for(;)一case1:enter();continue;case2:ddelete(&start,&last);continue;case3:list();continue;case4:search();continue;case5:save();continue;case6:loadO;continue;;一”c

21、hars80;intc;printf(人欢迎使用DOS通讯录系统通讯录系统an);printf(*printf(*请在做其它操作前先导入*n);先导入*n);pMntfpMntf(*);printf(w*1输入信息*、n)printf(*w*2删除信息*、n)printf(*w*);printf(w*1输入信息*、n)printf(*w*2删除信息*、n)printf(*w*3显示信息*、n)printf(*4查找*、n)printf(*w*5存盘*、n)printf(*w*6导入*n).printf(*w*7退出*、n)printf(*n)printf(doprintf(nPleaseent

22、eryourchoice:n)gets(s);c=atoi(s);while(c7);returnc;/*返回输入值*/voidenterO/*输入函数,本函数循环输入资料,当输入姓名为空时退出*/*定义/*定义structaddress*info;当前结点*/for(;)info=(structaddress*)malloc(sizeof(structaddress);/*为当前结点分配空间*/if(!info)printf(nOutofmemory);exit(0);exit(0);/*如果分配空间失败,退出程序*/来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来源网络,仅供参考来

23、源网络,仅供参考来源网络,仅供参考prinf(输入空姓名结束:n);inputs(请输入姓名:,info-name,10);if(!info-name0)break;/*如果输入姓名为空,结束循环*/inputs(请输入街道:,info-street,50);inputs(请输入城市:,info-city,15);inputs(请输入国家:,info-state,15);inputs(请输入邮编:,info-eip,7);insert(info,&start,&last);/*调用结点插入函数*/voidinputs(char*prompt,char*s,intcount)/*输入函数,有越界

24、检测功能*/charp255;doprintf(prompt);fgets(p,254,stdin);if(strlen(p)count)printf(nTooLongn);while(strlen(p)count);pstrlen(p)-1=0;voidinsert(/*数据插入函数*/structaddress*i,structaddress*start,structaddress*last)if(*last=NULL)/*如果尾结点为空,意味着当前链表为空*/一i-prior=NULL;*last=i;*start=i;else(*last)-next=i;i-prior=*last;i

25、-next=NULL;*last=(*last)-next;voidddelete(structaddress*start,structaddress*last)/*删除函数*/structaddress*info;chars80;inputs(请输入姓名:,s,10);/*输入欲删除结点的name域内容*/info=find;/*査找该内容*/if(info)/*如果找到*/*如果printf(Deletingn);/*如果if(*start=info)该结点为首结点,把该结点的下驱作为新的首结点(入口)*/*start=info-next;if(*start)(*start)-prior=NULL;else*last=NULL;else/*如果欲删除的结点不是首结点*/info-prior-next=info-next;/*令该结点的前驱的next指针指向该结点的后驱,*又令该结点的后驱的prior指点指向该结点的前驱*/if(info!=*last)/*如果该结点是尾结点,则令该结点的前驱为尾结点*/info-next-prior=info-prior;else*last=info-prior;free(info);/*释放该结点所占用的内存*/printf(-Ok,删除成功!n);_structaddress*info;info=start;if(!s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论