版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE1数据结构课程设计报告设计题目通讯录管理专业软件工程班级姓名学号完成日期目录1.问题描述………………32.系统设计………………33.数据结构与算法描述…………………74.测试结果与分析………105.总结…………………106.参考文献………………10附录程序源代码…………10通讯录管理问题描述本课程设计是设计一个实用的小型通讯录系统,具有输入,查询和删除等功能,设计合理、操作方便、运行稳定、功能完备,具有较高的实用价值。2.系统设计2.1设计目标完成通讯录的一般性管理工作:记录的增加、修改、删除和输出等功能。每个记录包含姓名、电话号码、住址等个人信息。要求将建立的通讯录以磁盘文件的形式存储,所有的通讯录管理活动均以文件操作的方式进行。在查找时,以记录的“姓名”或者以“学号”为关键字进行查找,删除时也以记录的“学号”和“姓名”进行删除。2.2设计思想使用单向链表保存数据的底层数据结构,并使用C++标准库提供的list来实现这个链表的结构。2.3系统模块划分菜单内容:1.通讯录链表的建立2.通讯录结点的插入3.通讯录结点的查询4.通讯录结点的删除5.通讯录链表的输出退出管理系统2.3.1通讯录的建立直接录入输入信息并保存。2.3.2通讯录的插入2.3.3通讯录的查询1可以按“姓名”或“电话”方式查询记录。2能给出查询记录的信息。3如果查询的信息不存在,输出“没有找到”的信息。2.3.4通讯录的删除1可以按“姓名”和“学号”方式删除记录并更新内存链表内容。2能给出被删除记录的信息。3如果没有要删除的信息,输出没有找到的信息。4删除操作仅限于内存,只有执行存记录时,才能覆盖原记录。2.3.5通讯录的输出可以随时显示录入的全部内容。2.3.6整体性能1应可以随时检索,删除或增加新记录,也可以保存或消除新的记录。2姓名可以由字符和数字混合编码。3电话号码可由字符和数字组成。5应当注意,输入电话号码的时候要改成英文输入。6使用菜单实现功能的正确选择3.数据结构与算法描述3.1数据结构列名数据类型长度可否为空编号char4Notnull姓名char10Notnull性别char10Notnull电话号码char11Null地址char31NotNull3.2流程图总体结构框架图主菜单主菜单通讯录的建立通讯录的插入入通讯录的查询通讯录的删除退出系统通讯录的输出按学号进行查询按姓名进行查询按学号进行删除按姓名进行删除流程图主菜单(菜单函数;主函数)主菜单(菜单函数;主函数)输入记录(输入函数)查询记录(查询菜单)删除记录(删除函数)插入记录(插入函数)显示记录(显示函数)保存文件(文件保存函数)退出系统(推出指令)按姓名查询按学号查询按电话号码查询按电话号码删除按姓名删除3.3算法描述(1)typedefstructLNode{intnumber;inttelenum;charname[20];charaddr[30];structLNode*next;}LNode,*LinkList;//用于通讯录结点(2)voidprintList(LinkListL){//打印头结点地址为L的通讯录(3)LinkListprior(LinkListL,LinkListp){if(L->next==NULL)return(L);LinkListp_prior=L;While(p_prior->next!=p){p_prior=p_prior->next;}return(p_prior);}//找到位于当前地址元素的前一元素的地址(4)intdeleteElem(LinkListL,inti)//从通讯录中删除第i个元素{LinkListp=L;intj=0;while(p->next&&j<i-1){p=p->next;j++;}if(!(p->next)||j>i-1){printf("第%d个元素删除失败\n",i);return0;}//判断i是否合法,i既不能大于元素的个数,也不能小于等于0LinkListq=p->next;p->next=q->next;free(q);//释放删除的结点return1;}(5)intsearchName(LinkListL,charn[]){//按姓名查找通讯者(6)intdelNum(LinkListL,intn){//按学号删除通讯者4.测试结果与分析经过修改后,程序能够编译,但执行时出现了问题,程序设置的是当一个人的信息输完时,在输第二个人的第一条信息时输入-1即可结束,但是执行时却在输入第二个人的全部信息都为-1时才结束,调试时发现是while循环的条件不正确,其条件由于设置的是number>=0,由于是while循环在结束时多读造成该错误,把该条件设置为true,并在该循环之中加入if-break终止语句,使其达到了预期效果。5.总结在此次的课程设计中,我充分意识到了自己的不足之处,虽然去年的数据结构学的不错,但真正编起程序来,还是觉得很多地方无从下手,以前真是眼高手低,和其他人的程序比起来,这个通讯录管理只是一个很小的系统,也很简单,但完成它我也煞费苦心,至于改进之处,我想不起来通讯录其他的功能了,我本来打算将其按名字进行排序的,但由于能力有限,最终没有完成,这是我的遗憾,我想我最大的收获就是知道自己还需要更进一步的努力,并会在以后的学习中引以为鉴,在此次课程设计中,一下几点是我的体会:(1).编程序前,要清楚自己的目标是什么,把设计思想理顺了再开始添加代码,否则就事倍功半。(2).对出现的错误要认真修改,增长经验,为以后的编程打下基础。(3).另外,编程过程中出现的许多问题都是经过域同学们商讨得出来的,让我意识到了团队精神的重要性。在此,非常感谢谭庆老师一年来的教育,作为一个很负责任的老师,他教会我们的不仅仅是知识,还有对待事情的态度,这些都是对我影响很大的。6.参考文献[1]苏仕华等.《数据结构课程设计》.北京:机械工业出版社,2007.12[2]刘振安等.《C++程序设计课程设计》.北京:机械工业出版社,2004.12.附录程序源代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#defineNULL0#defineLENsizeof(LNode)intlength;intseat;typedefstructLNode{intnumber;inttelenum;charname[20];charaddr[30];structLNode*next;}LNode,*LinkList;//用于通讯录结点voidprintList(LinkListL){//打印头结点地址为L的通讯录printf("\n\n");printf("NumberNameTelephoneNoAddr.\n");printf("\n");LinkListp=L;intn=1;if(L->next==NULL)printf("该链表中没有元素\n");elsewhile(p->next!=NULL){printf("%d%d",n,p->next->number);printf("%s%d%s\n",p->next->name,p->next->telenum,p->next->addr);p=p->next;n++;}printf("\n");return;}LinkListprior(LinkListL,LinkListp){if(L->next==NULL)return(L);LinkListp_prior=L;while(p_prior->next!=p){p_prior=p_prior->next;}return(p_prior);}//找到位于当前地址元素的前一元素的地址voidinsertYouXu(LinkListL,LinkListElem){//插入一个元素,使原有序表仍为有序LinkListp=L->next;while(p!=NULL&&Elem->number>=p->number){if(p->number==Elem->number){ printf("重复输入!!\n"); return;}p=p->next;}//确定Elem插入的位置if(p==NULL){ p=prior(L,p); Elem->next=NULL; p->next=Elem;}else//若为空表,插到头结点之后{ p=prior(L,p); Elem->next=p->next; p->next=Elem;}}LinkListcreatIncreLink()//创建一个非递减有序表,返回头结点地址{LinkListL=(LinkList)malloc(LEN);//头结点L->next=NULL;LinkListp;intnum=1;intnumber,telenum;charname[20];charaddr[30];printf("请输入学生学号、姓名、电话号码、家庭住址,建立通讯录,以'-1'为输入结束标志\n");printf("Inputnumber%d:",num);scanf("%d",&number);printf("Inputname%d:",num);chartemp=getchar();gets(name);printf("Inputthetelephonenumber%d:",num);scanf("%d",&telenum);printf("Inputaddr%d:",num);chartemp1=getchar();gets(addr);while(true){p=(LinkList)malloc(LEN);//新结点p->number=number;p->telenum=telenum;strcpy(p->name,name);strcpy(p->addr,addr);insertYouXu(L,p);//有序的插入新结点num++;printf("Inputnumber%d:",num);scanf("%d",&number);if(number==-1)break;printf("Inputname%d:",num);temp=getchar();gets(name);printf("Inputthetelephonenumber%d:",num);scanf("%d",&telenum);printf("Inputaddr%d:",num);temp1=getchar();gets(addr);}return(L);}intdeleteElem(LinkListL,inti)//从通讯录中删除第i个元素{LinkListp=L;intj=0;while(p->next&&j<i-1){p=p->next;j++;}if(!(p->next)||j>i-1){printf("第%d个元素删除失败\n",i);return0;}//判断i是否合法,i既不能大于元素的个数,也不能小于等于0LinkListq=p->next;p->next=q->next;free(q);//释放删除的结点return1;}intsearchNum(LinkListL,intn){//按学号查找通讯者intflag=0;LinkListp=L->next;seat=1;if(L->next==NULL)printf("该链表中没有元素,查找失败\n");else{while(p!=NULL){if(p->number<=n)if(p->number==n){flag=1;printf("要查找的是第%d位通讯者:\n",seat);printf("Number:%dName:%sTeleNo.:%d\n",p->number,p->name,p->telenum);}p=p->next;seat++;//!!!!}}returnflag;}intsearchName(LinkListL,charn[]){//按姓名查找通讯者intflag=0;LinkListp=L->next;seat=1;if(L->next==NULL)printf("该链表中没有元素,查找失败\n");else{while(p!=NULL){if(!strcmp(p->name,n)){flag=1;printf("要查找的是第%d位通讯者:\n",seat);printf("Number:%dName:%sTeleNo:%dAddr.:%s\n",p->number,p->name,p->telenum,p->addr);}p=p->next;seat++;//!!!!!}}returnflag;}intdelNum(LinkListL,intn){//按学号删除通讯者intflag=0;LinkListp=L->next;seat=1;if(L->next==NULL)printf("该链表中没有元素,删除失败\n");else{while(p!=NULL){if(p->number<=n){if(p->number==n){flag=1;printf("%d",p->number);p=p->next;deleteElem(L,seat);//seat++;}}else{p=p->next;seat++;}//!!!!}printf("被删除\n");}returnflag;}intdelName(LinkListL,charn[]){//按姓名查找通讯者intflag=0;LinkListp=L->next;seat=1;if(L->next==NULL)printf("该链表中没有元素,查找失败\n");else{while(p!=NULL){if(!strcmp(p->name,n)){flag=1;printf("%s",p->name);p=p->next;deleteElem(L,seat);//seat++;}else{p=p->next;seat++;}//!!!!!}if(flag)printf("被删除\n");}returnflag;}voidmain(){ system("colorf0"); LinkListL;printf("\n#######______________________^@^_welcome____________________________#####\n");printf("以下为功能菜单,请键入数字,选择算法:(2,3,4,5功能建立在1的基础上)\n");printf("功能1通讯录链表的建立:\n");printf("功能2通讯者结点的插入:\n");printf("功能3通讯者结点的查询:\n");printf("功能4通讯者结点的删除\n");printf("功能5通讯录链表的输出\n");printf("功能0退出管理系统\n");intflag=0;intmenu;printf("请选择0-5:");scanf("%d",&menu);while(menu!=0){switch(menu){case1:{L=creatIncreLink();printf("建立通讯录:");printList(L);flag=1;break;}case2:{if(flag==1){intnumber,telenum;charname[20];charaddr[30];printf("请输入通讯者的学号和姓名:\n");printf("Inputthenumber:");scanf("%d",&number);printf("Inputthename:");chartemp=getchar();gets(name);printf("Inputthetelephonenumber:");scanf("%d",&telenum);printf("Inputaddr:");chartemp1=getchar();gets(addr);LinkListp=(LinkList)malloc(LEN);//新结点p->number=number;strcpy(p->name,name);p->telenum=telenum;strcpy(p->addr,addr);insertYouXu(L,p);//有序的插入新结点printf("插入后:");printList(L);}elseprintf("\nERROR:通讯录还没有建立,请先建立通讯录\n");break;}case3:{intway,n;charna[20];ints;if(flag){printf("选择查找方式:\n");printf("1.按学号2.按姓名");printf("\nInputtheway:");scanf("%d",&way);if(way==1){printf("\nInputthenumber:");scanf("%d",&n);s=searchNum(L,n);if(s==0)printf("无此通讯者,查找失败!\n");}els
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论