《通讯录管理系统的设计与实现.doc》由会员分享,可在线阅读,更多相关《通讯录管理系统的设计与实现.doc(23页珍藏版)》请在三一办公上搜索。
1、湖南工业大学数据结构课程设计报告题 目 通讯录管理系统的设计与实现姓 名:学 号: 专 业: 班 级: 指导教师: 职 称: 理学院2011年6月目 录1 系统简介11.1 设计目的与要求11.1.1 设计目的11.1.2 设计要求12 总体设计12.1 系统功能概要12.2 数据结构及原理23 详细设计33.1 各模块调用关系33.2 插入信息43.3 显示信息43.4 查询信息43.5 其他功能54 系统测试65 总结11附录11课程设计作品验收表题目 参与人员姓 名 班 级 学 号 设计任务与要求: 建立通讯录信息,信息包括姓名、街道、城市、邮编、电话、国家等内容; 能够输出通讯录信息。
2、 能够提供添加、删除和查询通讯录信息等功能; 提供至少两种查询通讯录信息的方法; 能将通讯录保存在文件中。作品完成情况: 成功建立包括姓名、街道、城市、邮编、电话、国家等内容的通讯录系统; 提供了输出通讯录信息的方法; 提供了添加、删除和查询通讯录信息等功能; 提供了按姓名查找和按城市查找通讯信息的功能; 完成了将通讯录保存在文件中的功能。验收情况: 验收教师签名:_ 年 月 日注:1. 除“验收情况”栏外,其余各栏均由学生在作品验收前填写。2. “验收情况”栏由验收小组按实际验收的情况如实填写。通讯录管理系统的设计与实现1 系统简介1.1 设计目的与要求1.1.1 设计目的 随着信息社会的高
3、速发展,人与人之间的联系越来越频繁,通讯方式越来越多样化,如何保证与朋友、同学、同事、领导、亲戚等之间的联系,并能方便快捷的查找、记录、修改其相关通讯信息。仅靠以前单独的手工记录已远远不能满足当前的需要。开发一个通讯录管理系统,借助计算机可以方便、快捷、灵活的管理个人的朋友及相关人员的通讯信息,了解友人相关信息,帮助与友人保持联络。所以设计一个通讯录管理系统管理各人的通讯信息是是非必要的。1.1.2 设计要求建立通讯录信息,实现基础数据信息的录入,信息包括姓名、街道、城市、邮编、电话、国家等内容。实现查看信息的功能,能够输出全部的通讯录信息。实现通讯录管理系统的维护,能够提供包括添加通讯信息、
4、删除通讯信息和查询通讯录信息等功能。提供至少两种查询通讯录信息的方法,便于用户查找通讯信息。能将通讯录保存在文件中。2 总体设计2.1 系统功能概要通讯录管理系统是基于双向循环链表设计而成的信息管理系统。该系统通过对程序进行模块化,建立添加、显示、查找和删除功能的函数,各函数中运用双向循环链表存储数据。从主函数开始执行,调用各函数,并运用文件相关知识将信息存入磁盘中。系统功能模块图如图1:创建通讯录通讯录管理通讯录查询添加信息删除记录显示记录将信息存入文件按姓名查询图1 系统功能模块图2.2 数据结构及原理(1)为存储通讯录信息,需定义一个结构体类型,成员包括姓名、街道、城市、邮编、电话、国家
5、等,并建立双向循环链表,定义该结构体类型的指针,用于指向各结点。结构体定义如下:typedef struct message char name15;char street30;char city20;char eip20;char state20;char telephone20;dmessage;/*建立通讯录信息结构体;*/typedef struct dlnodedmessage data;struct dlnode *prior;/定义结点的前驱指针struct dlnode *next;/定义结点的后继指针dnode; /*建立双向链表结构体;*/ (2)以列表的形式输出文件。(3
6、)分别建立具有添加、删除、修改、查询等功能的子函数,完成相应功能,对程序实现模块化。这其中要用到对链表的删除、插入等知识。删除时用一结构体指针指向链表的第一个结点,检查该节点的值是否等于输入的要删除的信息,若相等就删除,不相等则后移指针,直至表尾。插入时也要先找到相应结点,再添加。查询功能要设置姓名、城市等多种方式。(4)为实现存储功能,需用到文件的相关函数,打开文件,将添加、修改或删除的信息存入磁盘中。3 详细设计3.1 各模块调用关系各模块调用关系图如图 2:插入信息删除信息显示信息按姓名查询存盘查询信息退出系统图2 各模块调用关系图3.2 插入信息插入信息功能(void enter(vo
7、id))是将各联系人的姓名、街道、城市、邮编、电话、国家等信息插入双向循环链表中。流程图如图3:定义指针,为指针分配存储空间输入数据将节点p插入链表,将指针rear移至结点p判断是否继续插入信息是 否返回第一步返回主菜单图3 插入信息3.3 显示信息显示信息(void printall(dnode *head))功能是将各人的姓名、街道、城市、邮编、电话、国家等信息全部以列表形式显示出来。流程图如图4: 定义一个节点p,指向第一个元素节点 P指向的不是尾结点真假输出p所指向的结点的信息P指向下一个结点返回主菜单图4 显示信息3.4 查询信息该系统提供了两种查询方式:第一种是按姓名查找;第二种是
8、按城市查找。(1)按姓名查找(dnode *namesearch(dnode *head))按姓名查找通讯信息的功能,是按照用户输入的姓名进行通讯信息的查找,将第一个与用户输入的姓名匹配的那条信息输出。流程图如图5:定义结点p,查找姓名信息与输入姓名一致的结点 找到匹配的结点p 否 是 输出“对不起,没有此数据相关的记录!”输出结点信息 继续查询 是 否返回第一步返回主菜单图5 按姓名查找(2)按城市查找(void citysearch(dnode *head) )按城市查找通讯信息的功能,是按照用户输入的城市进行通讯信息的查找,系统将所有城市信息与用户输入的信息匹配的通讯信息全部输出。流程图
9、如图 6:定义结点p,计数器n,查找城市信息与输入城市一致的结点找到匹配的结点p否 是p指向p的下一个结点n自增,p指向p的下一个结点n等于0是 否输出“没有相关数据!”输出匹配的所有数据返回主菜单图6 按城市查找3.5 其他功能该系统还有删除信息、将信息存盘以及退出系统等功能。(1) 删除信息删除信息(void delete(dnode *head))的功能是按照用户输入的姓名首先进行按姓名查询功能,查找成功,则执行删除信息的功能,查询不成功,则提示错误信息。流程图如图 7:定义结点p,输入要删除的信息的姓名,按姓名查找结点找到匹配的结点p否 是返回 确定删除是 否 删除结点返回返回主菜单图
10、7 删除信息(2) 存盘存盘功能(void save(dnode *head))是将用户建立的通讯录信息系统以文件的形式存入磁盘,需要用到文件的相关知识。流程图如图 8:定义结点p打开只写文件file.txt成功否 是退出p指向第一个元素结点p等于head否 是写入通讯信息提示错误保存并关闭文档图8 存盘(3) 退出系统退出功能(void quit(void)),使用完毕后,可退出该系统。4 系统测试(1)启动程序图9 启动程序(2)选择0,建立通讯录:图10 建立通讯录(4) 选择1,显示通讯信息:图11 显示通讯信息(5) 选择2,按姓名查询:图12 按姓名查询图13 按姓名查询失败(6)
11、 选择3,按城市查询:图14 按城市查询图15 按城市查询失败(7) 选择4,删除记录:图16 删除记录(8) 选择5,存盘:图17 存盘(9) 选择6,退出系统:图18 退出系统5 总结通过这次课程设计,我对C语言以及数据结构有了更深刻的了解,增强了程序的编写能力,巩固了专业知识,对程序的模块化观念也又模糊逐渐变的清晰了。在程序的运行与调试过程中出现了很多错误,通过反复地复习课本上的相关知识,不停地修改与调试,我终于完成了这段程序。在调试过程中,我认识到了数据结构的灵活性与严谨性,同一个功能可以由不同的语句来实现,但编写程序时要特别注意细节方面的问题,因为一个小小的疏忽就能导致整个程序不能运
12、行。我也认识到了自己的薄弱之处,如对链表相关知识的欠缺,文件运用的不熟练,在以后的学习中我要集中精力、端正态度,争取把知识学得更扎实、更全面。附录#include #include #include #includetypedef struct message char name15;char street30;char city20;char eip20;char state20;char telephone20;dmessage;/*建立通讯录信息结构体;*/typedef struct dlnodedmessage data;struct dlnode *prior;/定义结点的前驱指针
13、struct dlnode *next;/定义结点的后继指针dnode; /*建立双向链表结构体;*/dnode *head;/*定义一个头结点*/void enter(void)/输入记录dnode *p,*rear;/定义指针变量char flag=Y;/定义判断变量 head=(dnode *)malloc(sizeof(dnode);/为头指针分配存储空间rear=head;head-next=head;head-prior=head; /*建立双链表空头节点;*/while(flag=y|flag=Y)/当FLAG的值为Y或者y时,执行while里面的语句p=(dnode *)mal
14、loc(sizeof(dnode);/为结点p分配存储空间printf(ntt请输入通讯信息,各信息间用空格隔开,没有的信息请输入NULL);printf(ntt 姓名 街道 城市 邮编 电话 国家n);printf(tt-n);printf(tt);scanf(%s %s %s %s %s %s,&p-data.name,&p-data.street,&p-data.city,&p-data.eip,&p-data.telephone,&p-data.state);/输入个人的通讯信息到结点prear-next=p;p-prior=rear;/将结点p插入链表rear=p;/将指针rear移
15、至结点pp-next=head; /*向双链表中动态增加节点数据;*/printf(tt-n);printf(tt继续输入吗?(Y/N);scanf(%s,&flag);/输入flag的值,决定是否继续输入数据printf(n);void printall(dnode *head)/显示所有信息dnode *p;/定义结点pp=head-next;printf(ntt显示所有记录如下:n);printf(tt-n);printf(tt 姓名 街道 城市 邮编 电话 国家n);printf(tt-n);while(p!=head)/p未指向头结点时,执行while里面的语句printf(ntt%
16、8s %8s %8s %8s %8s %8s,&p-data.name,&p-data.street,&p-data.city,&p-data.eip,&p-data.telephone,&p-data.state);/输出p结点的各项信息printf(n);printf(tt-nn);p=p-next;/p指向下一个结点dnode *namesearch(dnode *head)/按姓名查找结点dnode *p;char name9;/定义一个长度为9的数组p=head-next;/p指向第一个信息结点scanf(%s,name);/输入要查找的姓名,存入name内while(p!=head
17、&p&strcmp(p-data.name,name)!=0)/查找姓名信息与输入姓名一致的结点p=p-next;/p指向下一个结点return p;/将查找到的结点返回void citysearch(dnode *head)/按城市查找结点dnode *p;int n=0;char city9;/定义一个长度为9的数组p=head-next;/p指向第一个信息结点printf(tt输入要查询的城市:);scanf(%s,city);/输入要查找的城市,存入city内while(p!=head)if(p!=head&p&strcmp(p-data.city,city)=0)/查找城市信息与输入
18、城市一致的结点n+;p=p-next;if(n=0)printf(tt没有相关数据!nn);else printf(ntt-n);printf(tt 姓名 街道 城市 邮编 电话 国家n);printf(ntt-n);p=head-next;while(p!=head)if(p!=head&p&strcmp(p-data.city,city)=0)/查找城市信息与输入城市一致的结点printf(tt%8s %8s %8s %8s %8s %8sn,p-data.name,p-data.street,p-data.city,p-data.eip,p-data.telephone,p-data.s
19、tate);p=p-next;printf(ntt-n);printf(tt查找成功!nn);void delete(dnode *head)/删除信息char f;dnode *p;p=namesearch(head);/查找要删除的结点pif(p=head)/没有找到要删除的数据,输出错误信息printf(ntt没有找到要删除的数据!nn); return;else/找到要删除的数据,执行删除操作printf(tt确定要删除吗?(Y/N);scanf(%s,&f);/确认删除操作if(f=Y|f=y)/确认删除操作后,执行删除操作p-prior-next=p-next;/使结点p的前驱的n
20、ext指针指向p的后继结点p-next-prior=p-prior;/使结点p的后继的prior指针指向p的前驱结点free(p);/释放结点pprintf(ntt删除成功!n);/输出成功信息void save(dnode *head)/将信息存入磁盘FILE *fp;/定义FILE类型fpdnode *p;/定义结点pint n=0,i;if(fp=fopen(file.txt,wb)=NULL)/打开只写文件file.txt,失败则显示打开失败信息printf(ntt打开文件失败!n);exit(1);/退出p=head-next;/结点p指向第一个数据的结点if(p!=head)/p不
21、等于结点head时,执行if语句while (p!=head)/p不等于结点head时,执行while语句p=p-next;/p指向下一个结点n+;/计算结点个数fprintf(fp,%d,n);/*写入节点个数;*/fprintf(fp,rn);/*写入回车符;*/p=head-next;for(i=0;idata.name,p-data.street,p-data.city,p-data.eip,&p-data.telephone,p-data.state);/fprintf(fp,ttrn);p=p-next;/*向文件中写入节点数据;*/elseprintf(Please make s
22、ure the data is not NULL!);fclose(fp);printf(ntt存盘成功!n);void quit(void)/退出exit(0);/退出void main()/主函数char flag=Y;for(;)/for循环dnode *q;int ch;printf(ntt通讯录系统:n);/通讯录系统操作的提示信息printf(tt=n);printf(tt 输入记录-0n);printf(tt 显示所有记录-1n);printf(tt 按姓名查询记录-2n);printf(tt 按城市查询记录-3n);printf(tt 删除记录-4n);printf(tt 存盘
23、-5n);printf(tt 退出-6n);printf(tt=n);printf(tt请输入数字(06):);scanf(%d,&ch);/输入操作序号,并将序号存入ch中switch(ch)case 0:/输入序号为0时,执行输入记录操作enter();break;case 1:/输入序号为1时,执行显示所有记录操作printall(head);break;case 2:/输入序号为2时,执行按姓名查询记录操作a:printf(ntt请输入姓名进行查询:);q=namesearch(head);/查找记录if(q!=head)/找到记录后,执行输出操作printf(ntt-n);print
24、f(tt 姓名 街道 城市 邮编 电话 国家n);printf(tt-n);printf(tt%8s %8s %8s %8s %8s %8s,q-data.name,q-data.street,q-data.city,q-data.eip,q-data.telephone,q-data.state);printf(ntt-n);printf(ntt查询成功!n);printf(ntt继续查询?(Y/N);scanf(%s,&flag);/输入y选择继续查询,输入n停止查询if(flag=Y|flag=y)goto a;else /没有找到记录,提示错误信息printf(ntt对不起,没有此数据相关的纪录!nn);break;case 3:/输入序号为3时,执行按城市查询记录操作citysearch(head);break;case 4:/输入序号为4时,执行删除记录操作printf(ntt请输入姓名删除纪录:);delete(head);break;case 5:/输入序号为5时,执行存盘操作save(head);break;case 6:/输入序号为6时,执行退出操作quit();break;default:printf(ntt警告!输入错误,请输入数字0-5!);/*用SWITCH函数选择菜单;*/