数据结构课程设计

上传人:jin****ng 文档编号:89260598 上传时间:2022-05-12 格式:DOC 页数:28 大小:299.50KB
收藏 版权申诉 举报 下载
数据结构课程设计_第1页
第1页 / 共28页
数据结构课程设计_第2页
第2页 / 共28页
数据结构课程设计_第3页
第3页 / 共28页
资源描述:

《数据结构课程设计》由会员分享,可在线阅读,更多相关《数据结构课程设计(28页珍藏版)》请在装配图网上搜索。

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

2、dress/*定义结构 */char name10;/*姓名*/char street50;/*街道*/char city10;/*城市*/char state15;/*国家*/char eip7;/*邮编*/struct address *n ext;/*后继指针*/struct address *prior;/*前驱指针 */链表的插入,删除来实现通讯录里的内容的插入删除当操作完成通过文件件来存储链表的信息,下次打开程序时, 读取文件里的内容到内存中,放在链表,然后又可以对链表进行操 作;在这里面,文件内容不可以在外部更改,只能通过读取到内存 链表中,通过程序进行更改,然后再写入到文件,写

3、入过程会覆盖 上次的内容。struct address *start;/*struct address *last;/*struct address *fin d(char *);/*void en ter();/*void search();/*void save();/*void load();/*void list();/*首结点*/尾结点*/声明查找函数*/函数声明*/查找,查找过程中调用find函数*/存盘,将链表信息保存到文件中*/导入,将文件内容导入到内存链表中*/ 显示当前链表中信息*/void ddelete(struct address *,struct address *

4、);void in sert(struct address *i,struct address *start,struct address *last);void in puts(char *,char *,i nt);void display(struct address *);int menu _select(void);三.详细设计1. 主界面设计通过switch语句调用各种函数,实现各种操作。然后把 switch嵌套到无限的for循环(for(;)中,使完成每一步操作 都回到到选择操作的主界面函数之间的相互调用E;学习佞琴设计 Debu g谐汛毎.exe:欢迎使用F呼通讯录系统 并餐箕

5、誕兴共狭秋賢其餐X 请在做其它操作前先导入共亲冥餐賓亲餐長長担耳舛冥兴兴墟凭XX3OfXXXMMKMMXKXMX冀共熹旅昶共共箕据共共共X乂冥共共1 输入信息 2由J除信息3 显示信息 4查我5 存盘 &占入&退出共共共旅共共兴駅X冥餐X餐冥冥X餐呉賓共冥冥賓眞米冥長兴賓址冥冥弭城冥長共菠姿慕并共共誤崔冥餐畀冥乂共冥X乂其共養義其糸餐兴義貰餐耳共冥耳涯其共抵基共其其甚其兴養其基料共齐其共其齐其義黑賢基冥貝杰養其毎Pld& enter your choice:void mai n()start = last = NULL;for(;)/*无限循环*/switch(menu_select()/*调

6、用主界面的选择函数,带回返回值 */case 1:e nter();con ti nue;case 2:ddelete(& start,&last);con ti nue;case 3:list();con ti nue;case 4:search();con ti nue;case 5:save();continue;case 6:load();continue;case 7:exit(0);int menu_select(void) /* char s80;主目录 */int c;A欢迎使用DOS通讯录系统A n);printf(*请在做其它操作前先导入 *n);printf(printf

7、( *printf( * 1.输入信息 *n);printf(* 2.删除信息 *n);printf(* 3.显示信息 *n);printf(* 4.查找*n);printf(* 5.存盘*n);printf(* 6.导入*n);printf(* 7.退出*n);printf( *doprintf(nPlease enter your choice:n);gets(s); c = atoi(s);/* 将获取的字符串转换成整型 */while(c7);return c;/*返回输入值*/2. 输入信息函数Please &ntr your choice:1输入空姓名结束; 请输入姓名;刘显安 请

8、输入街道;江西德安 请输入城市:徳安 请输入国家;中国 请精入邮: 123456 输入空姓名结束: 请输入姓名=:欢迎使用DOS通讯录系统 宾冥擬其冥冥其其其共冥媒i青在做其它操作前先导入冥貝共天冥共冥其x冥冥共餐XXXXXXXXXXXXXXMXWKXXXXXXXXXXXXXXXXX1 .输入信息r XXXXXXXXXXXXMXXXX 2. 删除信息 峯冥冥覧据冥冥箕冥冥舁共昇共慕共冥 3 显7J7信 息 XXXXXXXXXXXXXXXXX 查找 牡淀覧覧共冥共共据冥共共畀共慕址冥5衣-至 洪淤餐簧饋脊獗黄诞来淇潦餐来凭梵洪6 导入了 退出输入函数:struct address *info;/

9、*定义当前结点 */for(;)info=(struct address *)malloc(sizeof(struct address); /*为当前结点分配空间*/if(!i nfo)prin tf(n Out of memory);exit(0); /* 如果分配空间失败,退出程序 */printf( 输入空姓名结束 :n); inputs(请输入 姓名 :,info-name,10);if(!info-name0)break; /* 如 果输入姓名为空,结束循环 */inputs(请输入 街道 :,info-street,50);inputs(请输入 城市 :,info-city,15)

10、;inputs(请输入 国家 :,info-state,15);inputs(请输入 邮编 :,info-eip,7);insert(info,&start,&last); /* 调用结点插入函数 */ 输入函数调用到另外两个函数, inputs 和 insert其中 inputs 中还用到 fgets ( str,n,fp ),把键盘的输入信息传到 字符串中char p255;doprintf(prompt);fgets(p,254,stdin); /*stdin, 标准输入缓存,获取键盘输入 信息*/if(strlen(p)count)printf(nToo Longn);while(st

11、rlen(p)count);pstrlen(p)-1=0;strcpy(s,p);in sert是关键函数,每当输入完一条信息都会调用到in sert函数,将信息插入到链表中if(*last=NULL)/*如果尾结点为空,意味着当前链表为空*/*则将该结点赋给头尾结点*/i- next=NULL;i-prior=NULL;*last=i;*start=i;return;else /*如果链表不为空,则将信息插入到链表尾,作为尾结点*/(*last)-n ext=i;i-prior=*last;i- next=NULL;*last=(*last)-n ext;*last (*last)- nex

12、tNULL-n extNULLenter your choice:wtslH街道 湖北麻城L1J东枣庄 安徽阜阳 江西德安邮编23H567123456123斗5 &插入信息会显示在链表最后enter your choice:强坡安林 名志谢林显建 3姓吴杨王刘黄街道 润北麻城 山东枣庄 安徽阜阳 江西德安 江西抚州市城庄阳安州 城麻枣阜徳抚43830023156712345G1234563456233. 删除查找显示函数删除函数调用find函数,通过姓名,查找到该节点,然后删除 该节点信息,这其中涉及到头尾节点,及其变化;先判断是否为头结点,如果为头结点,则把原头结点的后继作 为新的头结点如果

13、不为头结点,则该节点的前驱的 next指向该节点的后继如果该节点为尾结点,则让该节点的前驱作为新的尾结点struct address *info;char s80;inputs(请输入 姓名:,s,10);in fo=fi nd(s);if(i nfo)if(*start=info)*start=info-next;if(*start)(*start)-prior=NULL;else *last=NULL;else info- prior-next=info-next;if(info!=*last)info-next-prior=info-prior;else*last=info-prior;

14、free(info);printf(-Ok, 删除成功 !n);与删除相比,查找就简单的多,只需要调用 find 的函数,找到该 节点记录并显示出来就行了,在 search 本身里面只要调整下输出的 界面就行了查找函数 , 形参为欲查找结点struct address *find(char *name) /* 的name域*/struct address *info;info=start;while(i nfo)if(!strcmp( name,i nfo-n ame) return info;in fo=i nfo-n ext;prin tf(Name not foun d.n);retur

15、n NULL;Please enter your choice:2请输入姓各王林Deleting-Q匕删除成功F:欢迎使用DO”通色录系统八 妊科就开冷科科芥托共詆苑请在働其它操 IF 前托导人 KMMKXXXXXXXJCKXXM3fKXX*XXX*XXXXb*XXXXXXXXXXXXXMXXXXXXXXXXXXKXKXXXXX1 输入信息2 删除信息3 显示信息查找5 存盘G 写入了退出XXXXXXXXXXXXXXXXXXX3tXKXJCXMXXXXXXXXXKPlease enter your choice:4请输入要查找的姓名:吴志强吴志强 湖北麻城麻城 中国 *38300:欢迎使用MJ

16、S通讯录系统冥熹共弼冥共共兴長冥娃長i青 在做其它操作前 先导 入糸买冥冥養梵英冥冥養*冥笑 料詆托光崔養養其耗箕養x耗托其餐養淹托评詆於汪牡黃料汪芹養幵料趺托箕其梵托评養齐淹科黑共料X煮 兴熹兴援兴董共其共簧餐兴其黄抵熹其1 .输入信自|料兴芳黄餐兴芥井兴熹其昶兴養葺兴兴黃输出函数更简单,直接输出链表即可if(i nfo二二NULL)printf(当前记录为空!);elseprintf( 姓名t街道tt 城市t国家t邮编tn);while(i nfo)组成display(i nfo); /*display为输出节点函数,一些列 print*/if(i nfo- next=NULL)break

17、; in fo=i nfo-n ext;3(3 显7F信息H.5 存盘 6.MXXXXXXXXMXXXXXMXKMXXMMXXXXXWKKX了退出Pl*吴志强 杨尚坡刘显安 黄建林enter your城庄阳安州 麻枣阜徳抚 道北东徽西西 街湖山安江江choice :市城庄阳安州 城麻枣阜德抚家国国国国国 霽中中中中中邮编8300235671 23斗561 234563456234. 存储与导入存储 存储时通过fopen打开文件(没有该文件时则创建)fp二fopen (,wb);/*生成文件*/if(!fp)printf(Cannot open file.n);return 然后通过 fwrit

18、e 将链表信息写入文件while(info) /* 把链表写入文件 */ fwrite(info,sizeof(struct address),1,fp);info=info-next;fwrite 每次从 info 读取一个 sizeof(struct address) 长度的数据, 写入 fp 文件中。写入完毕后即关闭文件 fclose(fp);导入导入时先建立链表,为节点分配内存空间 然后打开文件,将文件的内容写入内存链表中 register int t, size;struct address *info,*temp=0;打开文件 */调用文件 */为结点分配内存 */char *p;

19、FILE *fp; /* if(fp=fopen(,r)=NULL)printf(Cannot open file!n);return;printf(nnLoading.n);/*size=sizeof(struct address); /* start= (struct address *)malloc(size);if(!start) /*如果读取失败,返回 */printf(Out of memory!n);exit(0);info=start; p=(char*)info;while(*p+=getc(fp)!=EOF)for(t=0;tnext=(struct address *)m

20、alloc(size); if(!info-next)printf(Out of memory!n); return;info-prior=temp; temp=info;info=info-next; p=(char*)info;temp-next=0; last=temp;start-prior=0;fclose(fp);注意:每次文件存储的时候都会覆盖以前存在文件里的内容,而每 次导入的时候都会改变链表的内容。因此每次打开程序时请先导入存储在文件里的数据,或者将备份存储起来,避免数据丢失。四设计总结通过本次课程设计,我学到了很多东西。以前从没有用过文件方面的知识,而这次设计中用到了,刚开

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

22、truct address),1,fp) ;fclose( 文件指针 );五参考资料C程序设计(第三版)谭浩强清华大学出版社数据结构(C+版) 电出版社李根强中国水利水附完整源码:#include#include#includestruct address /*char name10;char street50;char city10;char state15;char eip7;struct address *next;/*struct address *prior;/*;定义结构 */后继指针 */ 前驱指针 */struct address *start;/*struct address

23、 *last;/*struct address *find(char *); /*首结点 */ 尾结点 */ 声明查找函数 */void enter(); /* 函数声明 */ void search();void save();void load();void list();void ddelete(struct address *start,struct address *last);void insert(struct address *i,struct address *start, struct address *last);void inputs(char *,char *,int

24、); void display(struct address *); int menu_select(void);void main()start = last = NULL;for(;)switch(menu_select()case 1:enter();continue;case 2:ddelete(&start,&last);continue;case 3:list();continue;case 4:search();continue;case 5:save();continue;case 6:load();continue;case 7:exit(0);int menu_select

25、(void)/*主目录 */char s80;int c;printf(A欢迎使用DOS通讯录系统An);printf( * 请在做其它操作前先导入 *n);printf( *n);printf( *1.输入信息*n);printf( *2.删除信息*n);printf( *3.显示信息*n);printf( *4.查找*n);printf( *5.存盘*n);printf( *6.导入*n);printf( *7.退出*n);printf(*n);doprintf(nPlease enter your choice:n); gets(s);c = atoi(s););return c; /*

26、返回输入值 */while(c7void enter() /* 输入函数 , 本函数循环输入资料, 当输入姓名为空时退出 */struct address*info; /* 定义当前结点 */for(;)info=(struct address *)malloc(sizeof(struct address); /* 为当前结点分配空间 */if(!info)printf(n Outof memory);exit(0);/* 如果分配空间失败,退出程序 */printf(输入空姓名结束 :n);inputs(请输入 姓名 :,info-name,10);if(!info-name0)break;

27、/* 如果输入姓名为空,结束循环 */inputs(请输入城市 :,info-city,15);inputs(请输入国家 :,info-state,15);inputs(请输入邮编 :,info-eip,7);insert(info,&start,&last); /*void inputs(char *prompt,char *s,int count)/*界检测功能 */char p255;调用结点插入函数 */输入函数,有越do printf(prompt);fgets(p,254,stdin);if(strlen(p)count) printf(nToo Longn); p)count);

28、pstrlen(p)-1=0;strcpy(s,p);void insert(while(strlen(/*数据插入函数 */struct address *i,struct address *start,struct address *last)如果尾结点为空 , 意味着当前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;void ddelete(struct add

29、ress *start,struct address *last) /* 删除函数 */struct address *info;char s80;inputs( 请输入 姓名 :,s,10);/* 输入欲删除结点的 name域内容 */info=find(s); /* 查找该内容 */if(info) /* 如果找到 */printf(Deletingn);if(*start=info)/* 如果该结点为首结点 , 把该结点的下驱作为新的首结点(入口) */*start=info- next;if(*start)(*start)- prior=NULL;else *last=NULL;els

30、e 首结点 */*如果欲删除的结点不是prior-next=info-next; /*的后驱,*指点指向该结点的前驱 */if(info!=*last) /* 则令该结点的前驱为尾结点 */info-next-prior=info-prior;else*last=info-prior;free(info); /*除成功 !n);struct address *find(char *name) /* 的name域*/info-令该结点的前驱的 next 指针指向该结点又令该结点的后驱的 prior如果该结点是尾结点,释放该结点所占用的内存 */printf(-Ok, 删查找函数 , 形参为欲查找

31、结点struct address *info;info=start;while(info)if(!strcmp(name ,info-name)return info;info=info-next;printf( 未找到相关信息 .n); return NULL;/*void list(void)*info;info=start;录为空 !);名t街道tt 城市t国家t邮编tn);while(info)next=NULL)break; info=info-next;printf(nn);输出整个链表 */struct addressif(info=NULL)printf( 当前记else pr

32、intf( 姓display(info);if(info-;void display(struct address *info) /*nfo-name);printf(%st,info-street);输出传入结点函数 */printf(%st,iprintf(%st,info-city); printf(%st,info-state);printf(%st,info-eip);printf(n);void search(void) /* 查找函数 */char name40; struct address *info;printf( 请输入要查找的姓名 :); /* 输入欲查找的姓名 */

33、gets(name);info=find(name);if(!info)printf( 姓名不 存在n);/*如果没找到,显示 Not found*/elsedisplay(info);/* 如果找到,显示该结点资料 */void save(void)/*保存函数 */struct address*info;FILE *fp;fp=fopen(,wb);/*生成文件 */if(!fp)printf(Cannotopen file.n);nSaveing n”);while(info)/*return;info=start; 把链表写入文件 */fwrite(info,siz eof(struc

34、t address),1,fp);info=info-next;printf(-ok!n);fclose(fp);/* 链表全部写入文件后,关闭文件 */void load()*/*调用预存文件函数size;struct address *info,*temp=0;char *p;FILE *fp; /* if(fp=fopen(,r)=NULL)register int t,打开文件 */open file!n);printf(Cannotreturn;printf(nnLoading.n);/*size=sizeof(struct address); /*address *)malloc(

35、size);if(!start) /* 返回 */memory!n);exit(0);info=start;p=(char*)info;while(*p+=getc(fp)!=EOF)调用文件 */ 为结点分配内存 */start= (struct如果读取失败,printf(Out offor(t=0;tnext=(struct address *)malloc(size);if(!info-next)printf(Out ofmemory!n);return;info-prior=temp; temp=info; info=info-next; p=(char*)info;temp-next=0; last=temp; start-prior=0; fclose(fp); printf(-OK!n);

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!