数据结构课程设计.docx_第1页
数据结构课程设计.docx_第2页
数据结构课程设计.docx_第3页
数据结构课程设计.docx_第4页
数据结构课程设计.docx_第5页
已阅读5页,还剩18页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、 问题描述具有数据的插入、修改、删除、显示和查询功能的电话薄管理程序。1、 有2个主文件用来存储数据,格式如下:info.txt文件:编号 姓名 性别 生日 电话1 电话2 所在地 分组 1 测试01 男 010113131311235 武汉 1 2 测试02 女 010113131311235 十堰 2 3 测试03 男 010113131311235 上海 3 4 测试04 男 010113131311235 北京 4 5 测试05 男 010113131311235 深圳 5 6 测试06 女 010113131311235 广州 0 7 测试07 男 010113131311235 十堰 0 8 测试08 男 010113131311235 武汉 0 groups.txt文件:编号 组名 人数 0 未分组 3 1 家人 1 2 朋友 1 3 同学 1 4 同事 1 5 老师 12、 可对info.txt文件中除了编号的所有信息进行修改,可对groups.txt中的组名进行修改。3、 可对两个文件增添相应的内容,增添时各项不可为空(空用给出的提示内容进行填充),两文件中的编号都不可更改且唯一且自增。4、 可根据唯一编号删除(修改)相应的人员信息和分组信息,删除时都会提示是否确认删除,防止误删现象发生。5、 可以读取显示所有保存在文件中的信息。6、 可以根据除编号以外的任意信息进行查询人员信息,在一次查询完成后,会提示是否在现有结果中继续查询,依次类推执行下去,以实现综合查询的目的。7、 可以将添加、修改、删除后的数据保存到相应文件中。在选择退出程序时,会提示是否已保存信息,防止误退的情形发生。二、 解题思路力求以简洁的操作界面,最少的内存使用和最高的效率为原则,带给用户清爽的体验。进入菜单,选择相应的操作,操作完毕有相应的提示语。操作完毕,返回菜单。根据问题描述中的内容,可以将程序系统设计分为以下几个模块:读取、保存、添加、删除、查询、修改和退出。通讯录管理系统读取记录退出系统保存记录添加记录删除记录修改记录查询记录退出查找按分组查找按地区查找按电话查找按性别查找按姓名查找查询所有设计框架:三、 算法描述主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。其中各功能模块用菜单方式选择。开始显示一系列功能,输入c判断c是否在范围内根据c的值调用各功能模块函数结束流程图: N Y四、 程序设计结构体:/*定义结构体*/*个人信息结构体*/typedef struct int Num; /编号char Name20; /名字char Sex5; /性别char DateB10; /出生日期char Tel112; /电话1char Tel212; /电话2char Location20; /所在地int GroupsId; /分组编号elemtype;typedef struct nodeelemtype data;struct node *next;linklist;/*分组信息结构体*/typedef struct Groupsint id;char name20;int num;struct Groups *next;GNode,*GList;主函数设计:程序启动进入主函数,进入主菜单界面和用户进行交互。/*主菜单*/int mean()linklist *l;GList g;l=FLoad(l);g=GLoad(g);while(l)int control;printf(tt*n);printf(tt* 1-读 取 信 息 *n);printf(tt* 2-保 存 信 息 *n);printf(tt* 3-添 加 人 员 *n);printf(tt* 4-添 加 分 组 *n);printf(tt* 5-删 除 人 员 *n);printf(tt* 6-删 除 分 组 *n);printf(tt* 7-查 询 人 员 *n);printf(tt* 8-查 询 分 组 *n);printf(tt* 9-修 改 人 员 *n);printf(tt* 10-修 改 分 组 *n);printf(tt* 0-退 出 系 统 *n);printf(tt*n);printf(ttt请输入相应操作数操作(010): );scanf(%d,&control);system(cls);switch(control)case 1:FRead(l,g);break;/读取信息case 2:FWrite(l,g);break;/保存信息case 3:PAdd(l,g);break;/添加人员case 4:GAdd(g);break;/添加分组case 5:PDelete(l,g);break;/删除人员case 6:GDelete(l,g);break;/删除分组case 7:listmean(l,g);break;/查询人员case 8:Select_all(g);break;/查询分组case 9:Modify(l,g);break;/更改人员case 10:Modify(g);break;/更改分组case 0:Exit(l,g);return 1;break;/退出系统default: printf(tt*输入数字有误,请重新输入*n);break; return 1; /*欢迎界面*/int main() /主函数printf(nnnn);printf(tt*n);printf(tt*-*n);printf(tt* *n);printf(tt* *n);printf(tt* 欢迎使用通讯录管理系统V1.1! *n);printf(tt* *n);printf(tt* *n);printf(tt* 任意键继续. *n);printf(tt* Power by WanGzhE *n);printf(tt*n);getch();system(cls);mean();return 0;添加模块:此模块分为两部分,一个是分组的增添,一个是人员信息的增添。分组增添,只提供增添分组名,分组的编号是自增且唯一的,人数是根据人员信息进行自动变动的;人员信息增添,进入界面后会有实例,并且会显示所有的分组,便于填写分组(在初次启动程序时,有默认的分组),人员的编号也是自增且唯一。在增添完信息后会提示注意保存信息。/*添加分组信息*/GList GAdd(GList g)printf(tt* 进行添加分组的操作 ! *n);int n,i;GList p,q,r;p=g;printf(输入要添加分组的个数:);scanf(%d,&n);while(p-next!=NULL)p=p-next;printf(请输入添加的记录n);printf(%sn,组名);for(i=1;inext)r=r-next;if(r-id=-1)q-id=1;else q-id=r-id+1;/控制编号的自增scanf(%s,&q-name);q-num=0;q-next=NULL;p-next=q;p=p-next;printf(n添加记录成功!n);printf(请注意保存!n);getch();system(cls);return g;/*添加人员信息*/linklist *PAdd(linklist *l,GList g)printf(tt* 进行添加信息的操作 ! *n);int n,i;linklist *p,*q,*r;GList s;s=g-next;p=l;printf(输入要添加信息的条数:);scanf(%d,&n);while(p-next!=NULL)p=p-next;printf(请输入添加的记录n);printf(分组:);while(s!=NULL)printf(%d-%s ,s-id,s-name);s=s-next;printf(n(每项都不能为空,若电话没有则填写0)n例如:张三 男 010115678456453 武汉 1n);printf(%s%10s%10s%10s%10s%10s%10sn,姓名,性别,生日,电话1,电话2,所在地,分组);for(i=1;inext;while(r-next)r=r-next;if(r-data.Num=-1)q-data.Num=1; /控制编号的自增else q-data.Num=r-data.Num+1;/控制分组的人数增加scanf(%s%5s%15s%15s%15s%8s%5d,&q-data.Name,&q-data.Sex,&q-data.DateB,&q-data.Tel1,&q-data.Tel2,&q-data.Location,&q-data.GroupsId);while(s!=NULL)if(q-data.GroupsId=s-id)s-num+;s=s-next;q-next=NULL;p-next=q;p=p-next;printf(n添加记录成功!n);printf(请注意保存!n);getch();system(cls);return l;删除模块此模块分为分组删除,人员删除两个部分。功能类似,都是先显示所有的人员(分组)信息,然后根据信息的编号删除所选信息;在删除人员时,同样会将相应分组的人员数进行改动;在删除分组时,会将分组内所有的人员分组改到“未分组”的组中(其中的人数也会发生相应变化)。在删除时会提示是否确认删除信息,防止误删的现象发生。信息删除后,相应的编号一起被删除,不影响其他的信息。/*删除人员信息*/int PDelete(linklist *l,GList g)int a;char c;ShowAllP(l);linklist *p,*q;q=l;p=l-next;printf(请输入要删除的信息编号:);scanf(%d,&a);printf(确定要删除编号为%d的信息?(Y/N):,a);c=getch();if(c=Y|c=y)while(p!=NULL)GList s;s=g-next;if(p-data.Num=a)while(s!=NULL)if(q-data.GroupsId=s-id)s-num-;s=s-next;q-next=p-next;p-next=NULL;printf(ntt* 删除成功!是否继续删除?(Y/N)!*n);c=getch();system(cls);if(c=Y|c=y)PDelete(l,g);return 1;p=p-next;q=q-next;printf(n没有此信息!删除失败!任意键返回!n);getch();system(cls);return 0;else system(cls);PDelete(l,g);return 1;/*删除分组信息*/int GDelete(linklist *l,GList g)int a;char c;ShowAllG(g);GList p,q;linklist *s;s=l-next;q=g;p=g-next;printf(请输入要删除的分组编号:);scanf(%d,&a);printf(确定要删除编号为%d的分组?(Y/N):,a);c=getch();if(c=Y|c=y)while(p!=NULL)while(s!=NULL)if(s-data.GroupsId=a)/将此分组内的人员放入“未分组”中s-data.GroupsId=0;g-next-num+;s=s-next;if(p-id=a)q-next=p-next;p-next=NULL;printf(ntt* 删除成功!是否继续删除?(Y/N)!*n);c=getch();system(cls);if(c=Y|c=y)GDelete(l,g);return 1;p=p-next;q=q-next;printf(n没有此信息!删除失败!任意键返回!n);getch();system(cls);return 0;elsesystem(cls);GDelete(l,g);return 1;查询模块此模块有两部分,第一部分人员信息查询,选择相应的操作后,会进入查询选择界面,可以根据人员的信息(姓名、性别、电话、地区、分组)进行查询,也可以查询所有的人员信息。在每一次查询完成后会询问是否继续查找,以实现多条件查询的目的。第二部分分组查询,鉴于分组信息不是特别复杂,所以就只是显示所有的分组。/*显示所有分组*/(显示所有人员的方式相同)void ShowAllG(GList g)GList p;p=g-next;if(p=NULL)printf(tt* 没有数据, 请输入信息 ! *n);elseprintf(ttt%6s%10s%10sn,编号,组名,人数);while(p!=NULL)printf(ttt%6d%10s%10dn,p-id,p-name,p-num);p=p-next;/*按姓名查找人员*/(查找的方式都是一样的只是改了个别参数,所以就只放出一个函数)int SelectByName(linklist *l,GList g)int flag=0;char a20,c;linklist *p,*q,*t,*s;q=Initlist(q);s=Initlist(s);q=s;p=l-next;printf(tt*人员查询*n);printf(请输入需要查找人员的姓名:);scanf(%s,a);if(p=NULL)printf(tt* 没有数据, 请输入信息 ! *n);elseprintf(%s%10s%5s%15s%15s%15s%8s%5sn,编号,姓名,性别,生日,电话1,电话2,所在地,分组);while(p!=NULL)if(strcmp(a,p-data.Name)=0)t=(linklist*)malloc(sizeof(linklist);/利用新的链表存放筛选后的所有信息t-data=p-data;t-next=NULL;q-next=t;q=q-next;printf(%4d%10s%5s%15s%15s%15s%8s%5dn,p-data.Num,p-data.Name,p-data.Sex,p-data.DateB,p-data.Tel1,p-data.Tel2,p-data.Location,p-data.GroupsId);flag=1;p=p-next;if(!flag)printf(没有姓名为%s的数据!n,a);printf(是否继续筛选?(Y/N)n);/实现多条件查询c=getch();if(c=y|c=Y)listmean(s,g);return 1;printf(tt* 任意键返回上一级 !*n);getch();system(cls);修改模块修改模块同样是分为人员信息修改和分组信息修改。人员信息的修改方式是根据唯一的编号选择需要修改的人员,然后询问需要修改的信息,用户回馈相应的编号,进行相应的操作,在每一项修改完成后会提示是否继续修改,关于人员信息分组的修改,在分组信息中也会进行相应的修改。分组信息的修改,同样只是修改分组名。/*人员信息修改*/int Modify(linklist *l,GList g)int a,b,x;char c20,f;linklist *p;printf(tt*修改人员*n);ShowAllP(l);dop=l-next;if(p=NULL)printf(tt* 没有数据, 请输入信息 ! *n);getch();system(cls);return 1;elseprintf(请输入要修改信息人员的编号:);scanf(%d,&a);while(p!=NULL)if(a=p-data.Num)break;p=p-next;if(p=NULL)printf(没有此编号的人员,请重新输入!n);while(p=NULL);doprintf(请输入要修改的信息序号(1-姓名 2-性别 3-生日 4-电话1 5-电话2 6-地区 7-分组): );scanf(%d,&b);switch(b)case 1:printf(请输入需要修改后的姓名:);scanf(%s,c);strcpy(p-data.Name,c);printf(tt* 修改成功 !*n);break;case 2:printf(请输入需要修改后的性别:);scanf(%s,c);strcpy(p-data.Sex,c);printf(tt* 修改成功 !*n);break;case 3:printf(请输入需要修改后的生日:);scanf(%s,c);strcpy(p-data.DateB,c);printf(tt* 修改成功 !*n);break;case 4:printf(请输入需要修改后的电话1:);scanf(%s,c);strcpy(p-data.Tel1,c);printf(tt* 修改成功 !*n);break;case 5:printf(请输入需要修改后的电话2:);scanf(%s,c);strcpy(p-data.Tel2,c);printf(tt* 修改成功 !*n);break;case 6:printf(请输入需要修改后的地区:);scanf(%s,c);strcpy(p-data.Location,c);printf(tt* 修改成功 !*n);break;case 7:ShowAllG(g);printf(请输入需要修改后的分组:);scanf(%d,&x);GList s;s=g-next;while(s!=NULL)if(p-data.GroupsId=s-id)s-num-;else if(x=s-id)s-num+;s=s-next;p-data.GroupsId=x;printf(tt* 修改成功 !*n);break;default:printf(tt* 输入有误 !*n);break;printf(是否继续修改?(Y/N):n);f=getch();while(f=y|f=Y);printf(tt* 任意键返回上一级 !*n);getch();system(cls);/*分组信息修改*/void Modify(GList g)int a;char c20;GList p;printf(tt*修改分组*n);ShowAllG(g);dop=g-next;printf(请输入要修改分组的编号:);scanf(%d,&a);if(p=NULL)printf(tt* 没有数据, 请输入信息 ! *n);exit(-1);elsewhile(p!=NULL)if(a=p-id)break;p=p-next;if(p=NULL)printf(没有此编号的分组,请重新输入!n);while(p=NULL);printf(请输入需要修改后的分组名: );scanf(%s,c);strcpy(p-name,c);printf(tt* 修改成功 !*n);printf(tt* 任意键返回上一级 !*n);getch();system(cls);个人认为的主要模块即数据的增、删、查、改都在上面给予说明,剩下一些其他函数,就做一下简单的说明。其他函数保存函数/*信息写入*/void FWrite(linklist *l,GList g)int y;FILE *fp,*gfp;printf(tt*正在保存文件信息,请稍后! *n);/*人员信息写入*/y=remove(info.txt);if(fp=fopen(info.txt,w+)=NULL)/判断文件是否打开成功 printf(tt* 文件info.txt保存失败 ! *n); linklist *p;p=l-next;if(p=NULL)printf(tt* 没有数据, 请输入信息 ! *n);elsefseek(fp,0L,0);fprintf(fp,%4s%10s%5s%15s%15s%15s%8s%5sn,编号,姓名,性别,生日,电话1,电话2,所在地,分组);while(p!=NULL)fprintf(fp,%4d%10s%5s%15s%15s%15s%8s%5dn,p-data.Num,p-data.Name,p-data.Sex,p-data.DateB,p-data.Tel1,p-data.Tel2,p-data.Location,p-data.GroupsId);p=p-next;printf(tt* 文件info.txt保存成功 ! *n);fclose(fp);/*分组信息写入*/y=remove(groups.txt);if(gfp=fopen(groups.txt,w+)=NULL)/判断文件是否打开成功 printf(tt* 文件groups.txt保存失败 ! *n); GList q;q=g-next;if(q=NULL)fprintf(gfp,%4s%10s%10sn,编号,组名,人数);printf(tt* 文件gropus.txt保存成功 ! *n);elsefseek(gfp,0L,0);fprintf(gfp,%4s%10s%10sn,编号,组名,人数);while(q!=NULL)fprintf(gfp,%4d%10s%10dn,q-id,q-name,q-num);q=q-next;printf(tt* 文件gropus.txt保存成功 ! *n);fclose(gfp);printf(tt* 任意键返回上一级 !*n);getch();system(cls);读取函数/*人员信息加载*/linklist* FLoad(linklist *l)/数据加载FILE *fp;linklist *p,*q,*t;p=Initlist(p);l=Initlist(l);t=l;fp=fopen(info.txt,a);if(fp=fopen(info.txt,r)=NULL)/判断文件是否打开成功 printf(tt* 文件info.txt打开失败 ! *n); return 0;fseek(fp,77L,0);while(fscanf(fp,%4d%10s%5s%15s%15s%15s%8s%5dn,&p-data.Num,&p-data.Name,&p-data.Sex,&p-data.DateB,&p-data.Tel1,&p-data.Tel2,&p-data.Location,&p-data.GroupsId)!=EOF)q=(linklist *)malloc(sizeof(linklist);q-next=NULL;q-data=p-data;t-next=q;t=t-next;fclose(fp);return l;/*分组信息加载*/GList GLoad(GList g)char *a=未分组,家人,朋友,同学,同事,老师;FILE *fp;GList p,q,t;p=InitGList(p);g=InitGList(g);t=g;if(fp=fopen(groups.txt,r)=NULL)/判断文件是否打开成功 GList x,y;y=g;fp=fopen(groups.txt,a);fprintf(fp,%4s%10s%10sn,编号,组名,人数);for(int i=0;inext=NULL;x-id=i;strcpy(x-name,ai);x-num=0;y-next=x;y=y-next; fclose(fp);fseek(fp,24L,0);while(fscanf(fp,%4d%10s%10dn,&p-id,&p-name,&p-num)!=EOF)q=(GList)malloc(sizeof(GNode);q-next=NULL;q-id=p-id;strcpy(q-name,p-name);q-num=p-num;t-next=q;t=t-next;fclose(fp);return g;退出函数void Exit(linklist *l,GList g)char c;printf(即将退出,是否确认信息已保存?(Y/N):);c=getch();if(c=y|c=Y)system(cls);printf(nnnn);printf(tt*n);printf(tt*-*n);printf(tt* *n);printf(tt* *n)

温馨提示

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

评论

0/150

提交评论