1、通讯录管理系1通讯录管理系统1. 引言数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。 通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。2.系统设计2.1. 设计目的本课程设计可加深对课堂理论学习的理解,增强动手能力,以培养学生合作的能力,为毕业设计作好实践环节上的准备。通讯录系统是在学校常
2、见的计算机信息管理系统。它的主要任务是对学生信息进行管理,如学生信息的输入、查询、修改、增加、删除,迅速准确地完成各种学生信息的统计和查询。 2.2.设计内容(1)数据包括:姓名(name)街道(street)城市(city)邮编(eip)国家(state)。(2)可删除记录。(3)可显示所有保存的记录。(4)可按人的姓名进行查询。2.3.设计思路通过visual c+(用的是C语言)编写的一个控制台程序,该程序通过链表的操作,文件存储来实现通讯录的基本功能。struct address /*定义结构*/ char name10; /*姓名*/ char street50; /*街道*/ ch
3、ar city10; /*城市*/ char state15; /*国家*/ char eip7; /*邮编*/ struct address *next; /*后继指针*/ struct address *prior; /*前驱指针*/链表的插入,删除来实现通讯录里的内容的插入删除,当操作完成通过文件件来存储链表的信息,下次打开程序时,读取文件里的内容到内存中,放在链表,然后又可以对链表进行操作;2.4. 详细设计1.主界面设计通过switch语句调用各种函数,实现各种操作。然后把switch嵌套到无限的for循环(for(;))中,使完成每一步操作都回到到选择操作的主界面函数之间的相互调用
4、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(void) /*主
5、目录*/ char s80; int c;printf(欢迎使用DOS通讯录系统n);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); do printf(nPlease enter your choice:n); gets(s); c = atoi(s); /*将获取的字符串
6、转换成整型*/ while(c7); return c; /*返回输入值*/2.输入信息函数struct address *info; /*定义当前结点*/for(;) info=(struct address *)malloc(sizeof(struct address); /*为当前结点分配空间*/ if(!info) printf(n Out of memory); exit(0); /*如果分配空间失败,退出程序*/ printf(输入空姓名结束:n); inputs(请输入 姓名:,info-name,10); if(!info-name0)break; /*如果输入姓名为空,结束循
7、环*/ 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),把键盘的输入信息传到字符串中char p255; do printf(prompt); fgets(p,254,stdin);/*stdin,标准输入缓存,获取
8、键盘输入信息*/ if(strlen(p)count) printf(nToo Longn); while(strlen(p)count); pstrlen(p)-1=0; strcpy(s,p);insert是关键函数,每当输入完一条信息都会调用到insert函数,将信息插入到链表中if(*last=NULL) /*如果尾结点为空,意味着当前链表为空*/ /*则将该结点赋给头尾结点*/ i-next=NULL; i-prior=NULL; *last=i; *start=i; return; else /*如果链表不为空,则将信息插入到链表尾,作为尾结点*/ (*last)-next=i;
9、i-prior=*last; i-next=NULL; *last=(*last)-next; NULL NULL3.删除查找显示函数删除函数调用find函数,通过姓名,查找到该节点,然后删除该节点信息,这其中涉及到头尾节点,及其变化;先判断是否为头结点,如果为头结点,则把原头结点的后继作为新的头结点如果不为头结点,则该节点的前驱的next指向该节点的后继如果该节点为尾结点,则让该节点的前驱作为新的尾结点struct address *info;char s80;inputs(请输入 姓名:,s,10); info=find(s); if(info) printf(Deleting.n);if
10、(*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;free(info); printf(-Ok,删除成功!n);与删除相比,查找就简单的多,只需要调用find的函数,找到该节点记录并显示出来就行了,在search本身里面只要调整下输出的界面就行了struct address *find(char
11、 *name) /*查找函数,形参为欲查找结点的name域*/struct address *info; info=start; while(info) if(!strcmp(name,info-name)return info; info=info-next; printf(Name not found.n); return NULL;输出函数更简单,直接输出链表即可if(info=NULL)printf(当前记录为空!);else printf(姓名t街道t城市t国家t邮编tn);while(info)display(info);/*display为输出节点函数,一些列print组成*/i
12、f(info-next=NULL) break; info=info-next;4.存储与导入存储存储时通过fopen打开文件(没有该文件时则创建)fp=fopen(record.txt,wb); /*生成文件*/if(!fp)printf(Cannot open file.n);return然后通过fwrite将链表信息写入文件while(info) /*把链表写入文件*/fwrite(info,sizeof(struct address),1,fp); info=info-next;fwrite每次从info读取一个sizeof(struct address)长度的数据,写入fp文件中。写
13、入完毕后即关闭文件fclose(fp);导入导入时先建立链表,为节点分配内存空间然后打开文件,将文件的内容写入内存链表中register int t, size; struct address *info,*temp=0; char *p; FILE *fp; /*打开文件*/if(fp=fopen(record.txt,r)=NULL) printf(Cannot open file!n);return; printf(nnLoading.n); /*调用文件*/ size=sizeof(struct address); /*为结点分配内存*/start= (struct address *
14、)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 *)malloc(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=tem
15、p; start-prior=0; fclose(fp);3.程序清单#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 *last; /*尾结点*/struct address *find(char *);
16、 /*声明查找函数*/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);void display(struct address *);int menu_select(void);
17、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(void) /*主目录*/ char s80; int c; printf(欢
18、迎使用DOS通讯录系统n); 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); do printf(nPlease enter your choice:n); gets(s); c = atoi(s); while(c7); return c; /*返回输入值*/void e
19、nter() /*输入函数,本函数循环输入资料,当输入姓名为空时退出*/ struct address *info; /*定义当前结点*/ for(;) info=(struct address *)malloc(sizeof(struct address); /*为当前结点分配空间*/ if(!info) printf(n Out of memory); exit(0); /*如果分配空间失败,退出程序*/ printf(输入空姓名结束:n); inputs(请输入 姓名:,info-name,10); if(!info-name0) break; /*如果输入姓名为空,结束循环*/ inp
20、uts(请输入 街道:,info-street,50); 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
21、Longn); while(strlen(p)count); pstrlen(p)-1=0; strcpy(s,p);void insert( /*数据插入函数*/ 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
22、)-next; void ddelete(struct address *start,struct address *last) /*删除函数*/ struct address *info; char s80; inputs(请输入 姓名:,s,10); /*输入欲删除结点的name域内容*/ info=find(s); /*查找该内容*/ if(info) /*如果找到*/ printf(Deleting.n); if(*start=info) /*如果该结点为首结点,把该结点的下驱作为新的首结点(入口)*/ *start=info-next; if(*start) (*start)-pri
23、or=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); struct address *find(char *na
24、me) /*查找函数,形参为欲查找结点的name域*/ struct address *info; info=start; while(info) if(!strcmp(name,info-name)return info; info=info-next; printf(未找到相关信息.n); return NULL; /*输出整个链表*/void list(void) struct address *info; info=start; if(info=NULL) printf(当前记录为空!); else printf(姓名t街道tt城市t国家t邮编tn); while(info) disp
25、lay(info); if(info-next=NULL)break; info=info-next; ; printf(nn); void display(struct address *info) /*输出传入结点函数*/ printf(%st,info-name); printf(%st,info-street); printf(%st,info-city); printf(%st,info-state); printf(%st,info-eip); printf(n);void search(void) /*查找函数*/ char name40; struct address *info; printf(请输入要查找的姓名:); /*输入欲查找的姓名*/ gets(name); info=find(name); if(!info) printf(姓名不存在n); /*如果没找到,显示Not found*/ else display(info); /*如果找到,显示该结点资料*/void save(void) /*保存函数*/ struct address *info; FILE *fp; fp=fop
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1