![[工学]通讯录——数据结构课程设计.doc_第1页](http://file.renrendoc.com/FileRoot1/2019-1/10/62d3e377-8cd9-4e53-8929-6010edc5fc12/62d3e377-8cd9-4e53-8929-6010edc5fc121.gif)
![[工学]通讯录——数据结构课程设计.doc_第2页](http://file.renrendoc.com/FileRoot1/2019-1/10/62d3e377-8cd9-4e53-8929-6010edc5fc12/62d3e377-8cd9-4e53-8929-6010edc5fc122.gif)
![[工学]通讯录——数据结构课程设计.doc_第3页](http://file.renrendoc.com/FileRoot1/2019-1/10/62d3e377-8cd9-4e53-8929-6010edc5fc12/62d3e377-8cd9-4e53-8929-6010edc5fc123.gif)
![[工学]通讯录——数据结构课程设计.doc_第4页](http://file.renrendoc.com/FileRoot1/2019-1/10/62d3e377-8cd9-4e53-8929-6010edc5fc12/62d3e377-8cd9-4e53-8929-6010edc5fc124.gif)
![[工学]通讯录——数据结构课程设计.doc_第5页](http://file.renrendoc.com/FileRoot1/2019-1/10/62d3e377-8cd9-4e53-8929-6010edc5fc12/62d3e377-8cd9-4e53-8929-6010edc5fc125.gif)
已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计通讯录目 录1、 课程设计的目的:12、 需求分析:11. 要求:12. 详细功能:13、课程设计报告内容:11. 通讯录管理系统调用关系图:12. 设计结构体及函数表:23. 实现主程序和各模块的调用关系:24、 详细设计:31. 各个操作的算法实现:32.程序清单:(见附录)45、参考文献:56、 部分运行结果界面:51.调试分析:72. 调试中遇到的问题:77、总结:88、附录:(程序)881、 课程设计的目的:用数据结构中的双向链表作数据结构,结合C语言基本知识。编写一个通讯录管理系统。以把所学数据结构知识应用到实际软件开发中去。了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;2、 需求分析:1. 要求:(1) 设计一个实用的小型通讯录,用双向链表做数据结构,编写一个通讯录管理系统实现通讯录信息的输入、添加、显示、以姓名做关键字进行查找、删除信息等功能。(2) 每条信息至少包含:姓名、街道、城市、邮编、国家等信息。2. 详细功能:A. 载入文件load():将磁盘中可能存在的文件载入到内存中。A.信息输入enter():系统将提示输入新纪录所需信息,信息包含:姓名、街道、城市、邮编、国家。B.信息删除del():首先提示用户输入要删除的纪录姓名,然后调用删除函数,删除该纪录的相关资料,支持重名选择删除和循环删除。C.查找search():提示用户输入要查找的姓名,然后系统调用查找函数查找,接着系统使用相关命令输出查到的全部信息。D.显示全部display():将内存中的纪录内容全部输出,包括未保存到磁盘的记录项。E.保存save():将操作结果实时保存到磁盘文件txl.txt中,完成后返回到主菜单界面。F.退出系统exit(0):直接退出系统,不保存修改。3、课程设计报告内容:1. 通讯录管理系统调用关系图:2. 设计结构体及函数表:(1)结构体:struct record char name20; char street20; char city20; char eip20; /邮编char state20; people500;/500个记录,可修改struct pnoderecord data;struct pnode *next, *prior;/双循环链表;typedef pnode * linklist;(2)函数目录表:void mainmenu();/主菜单void searchmenu();/查询菜单void enter();/添加新纪录void search();/按条件搜索记录void display();/显示全部记录void load();/载入文件void save();/写入文件void del();/删除记录void listinsert();/插入结点函数void initlist();/初始化链表函数3. 实现主程序和各模块的调用关系:void main() /主函数 initlist();/初始化链表load();/载入文件listinsert(); /增设新节点while (1)mainmenu(); /进入主菜单,有非法输入仍停留在主菜单 void mainmenu()/主菜单 菜单界面;printf(%c ,ch=getch(); switch (ch) case 1:enter();break; case 2:searchmenu();break; case 3:del();break; case 4:save();break;case 5:exit(0); default:mainmenu(); void searchmenu()/查询菜单 查询菜单;printf(%c,ch=getch(); switch (ch) case 1:display();break; case 2:search();break; case 3:mainmenu();break; 4、 详细设计:1. 各个操作的算法实现:(1)链表初始化void initlist()/链表初始化函数l=(linklist)malloc(sizeof(pnode);/动态申请内存l-next=l;l-prior=l;(2)载入可能存在的通讯录文件void load()/装载已有文件信息 /无文件,新建立文件;/已有文件,导入文件;(3)增加新结点void listinsert()/增加新结点 /插入新结点,读入内存信息;(4)添加新纪录(可循环)void enter()/添加新纪录 /信息输入; /是否继续添加?; (5) 按姓名查找(同时显示全部符合要求的结果,包括没有保存到磁盘的)void search() /输入姓名;/输出查询结果;/检索可能的重名纪录;(6) 显示所有记录(包括没有保存到磁盘的)void display()/显示所有纪录 /显示内存中的所有记录; (7) 删除指定记录(可循环)void del() /删除纪录 /输入要删除的姓名;/查找符合条件的记录,对于每条记录询问是否删除;/满足条件的输出结束,询问是否删除其他记录,循环;(8) 保存到磁盘文件(实时写入文件)void save()/ /写入文件操作;2.程序清单:(见附录)5、参考文献:1 严蔚敏,吴伟民 编著. 数据结构(C语言版)北京: 清华大学出版社,2007.2 谭浩强 编著 C程序设计(第三版)北京:清华大学出版社,20083 刘振安,孙忱,刘燕君 编著 C程序设计课程设计北京:机械工业出版社,20076、 部分运行结果界面:1.调试分析:经过反复测试,最终提供了一个较为友好的界面和操作模式,而且容错能力较好,稳定性很强。下面做一些简单的说明:(1)2级菜单只是作为一种尝试,并非必须!(2) 在界面排版上,我学习了互联网上部分程序的界面编排,其中以格式控制方式显示提 高了界面显示的稳定性,较为理想。(3) 在文件读取和保存方面,该程序做到了实时保存保存和读取,操作非常简便。(4) 在查找方面,我将其设计为一次多记录的显示方式,也更合乎操作习惯,界面较为友 好,对于无符合条件的结果,只是结果集为空,界面保持不变。同时,它是实时读取 的,可以将刚刚输入而未保存的记录也读取到!另外,一次查询结束后返回的是查询 菜单,可以直接进行下一次的查询,也较为合理。(5) 删除功能我做了较多的工作,整体界面和设计都较为合理。对于输入的姓名,查找出结果后提示是否删除。若有重名,则会二次显示,提示是否删除,一直到所有记录查询结束(可以在重名中选中需要的进行删除,并不需要删除每一个纪录)。结束之后可以直接再次删除其他纪录,因为它提供循环删除操作功能。2. 调试中遇到的问题:(1) 对于continue,很多时候要慎重,它似乎容易导致与go类似的错误!我曾遇到了这么个问题:调用了search函数之后再调用enter函数输入新的记录,输入结束之后会直接转入search函数在continue之后的部分,执行结果使得界面混乱!后来将continue后面的部分移出循环体,这个问题得到了解决!但还是不甚明了其中内含!(2) 对于文本的排版还有些问题。您可以看到,通讯录文件的内容相对较乱,没有以一行一记录的形式保存。多次尝试后无果,希望老师能给以解答!7、总结:通过做这个课程设计让我了解并掌握了数据结构与算法的设计方法,初步掌握了独立分析和设计能力;以及软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;使我提高了编写技术文献的能力(尤其是目录的提取,结构图的绘制等)。8、附录:(程序)#include #include #include #include struct record char name20; char street20; char city20; char eip20; /邮编char state20; people500;/500个记录,可修改struct pnoderecord data;struct pnode *next, *prior;/双循环链表;typedef pnode * linklist;linklist l;int len=0;/链表长度FILE *fp; /文件指针void mainmenu();/主菜单void searchmenu();/查询菜单void enter();/添加新纪录void search();/按条件搜索记录void display();/显示全部记录void load();/载入文件内容void save();/写入文件void del();/删除记录void listinsert();/插入结点函数void initlist();/初始化链表函数void main() /主函数 initlist();load();listinsert(); while (1)mainmenu(); /进入主菜单,有非法输入仍停留在主菜单 void initlist()/链表初始化函数l=(linklist)malloc(sizeof(pnode);/动态申请内存l-next=l;l-prior=l;void load()/装载已有文件信息 if(fp=fopen(txl.txt,rb)=NULL) printf(ntt通讯录文件不存在); if (fp=fopen(txl.txt,wb)=NULL) printf(ntt建立失败); exit(0); else printf(ntt通讯录文件已建立); printf(ntt按任意键进入主菜单); getch(); return; exit(0); /导入文件功能部分fseek(fp,0,2); if (ftell(fp)0) rewind(fp); for(len=0;!feof(fp)&fread(&peoplelen,sizeof(struct record),1,fp);len+); printf(ntt文件导入成功); printf(ntt按任意键返回主菜单); getch(); return; printf(ntt文件导入成功); printf(ntt通讯录文件中无任何纪录); printf(ntt按任意键返回主菜单); getch(); return; void listinsert()/增加新结点 linklist s,p=l;for(int i=0;,); strcpy(s-data.city,peoplei.city); strcpy(s-data.street,peoplei.street); strcpy(s-data.eip,peoplei.eip); strcpy(s-data.state,peoplei.state); s-prior=p-prior; s-next=p; p-prior-next=s; p-prior=s;p=p-next;void mainmenu()/主菜单 char ch; system(cls); printf(ntt*欢迎进入通讯录系统*); printf(ntt*1-新添纪录 *); printf(ntt*2-查找联系人 *); printf(ntt*3-删除联系人 *); printf(ntt*4-保存 *); printf(ntt*5-退出 *); printf(ntt*); printf(ntt请选择:); printf(%c ,ch=getch(); switch (ch) case 1:enter();break; case 2:searchmenu();break; case 3:del();break; case 4:save();break;case 5:exit(0); default:mainmenu(); void enter()/添加新纪录 printf(ntt* 请输入学生信息 *n); printf(ntt姓名:); scanf(%s,&); printf(ntt街道:); scanf(%s,&peoplelen.street); printf(ntt城市:); scanf(%s,&peoplelen.city); printf(ntt邮编:); scanf(%s,&peoplelen.eip); printf(ntt国家:); scanf(%s,&peoplelen.state); len+; printf(ntt是否继续添加?(Y/N):); if (getch()=y) enter(); return; void searchmenu()/查询菜单 char ch; system(cls); printf(ntt* 查询菜单 *); printf(ntt* 1-显示所有记录 *); printf(ntt* 2-按姓名查询 *); printf(ntt* 3-返回主菜单 *); printf(ntt*); printf(ntt请选择:); printf(%c,ch=getch(); switch (ch) case 1:display();break; case 2:search();break; case 3:mainmenu();break; void search() printf(ntt* 按姓名查找 *); char name20; printf(ntt请输入姓名:); scanf(%s,name); printf( 查询到的信息:n); printf( %-18s%-18s%-18s%-15s%sn,姓名,街道,城市,邮编,国家);/格式控制输出printf( -n);for (int i=0;ilen;i+) if(strcmp(name,)=0)printf( %-18s%-18s%-18s%-15s%sn,,peoplei.street,peoplei.city,peoplei.eip,peoplei.state);if (i+1len) continue;/重名纪录再检索 printf( -n);printf(ntt按任意键返回查询菜单); getch(); searchmenu(); void display()/显示所有纪录 int i; system(cls); if(len!=0) printf(ntt* 以下为通讯录所有信息*nn); printf( %-18s%-18s%-18s%-15s%sn,姓名,街道,城市,邮编,国家);printf( -n);for (i=0;ilen;i+) printf( %-18s%-18s%-18s%-15s%sn,,peoplei.street,peoplei.city,peoplei.eip,peoplei.state);if (i+1len) continue; printf( -n); else printf(ntt通讯录中无任何纪录); printf(ntt按任意键返回查询菜单:); getch(); searchmenu(); void del() /删除纪录 int a=0,i,j,findmark; /findmark为查找结果标志 / int findmark=0,delmark=0; char name20; printf(ntt请输入要删除学生姓名:); scanf(%s,name); for (i=a;ilen;i+) if (findmark=strcmp(,name)=NULL) /找到一条符合条件的记录 /findmark+; printf(ntt以下是您要删除的学生纪录:n); printf( %-18s%-18s%-18s%-15s%sn,姓名,街道,城市,邮编,国家);printf( -n);printf( %-18s%-18s%-18s%-15s%sn,,people
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论