您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > 数据结构以文件设计通讯表
设计要求:(1)定义通讯录链表结点结构类型,以txlList和*TxlLink命名,数据域:好友姓名Name、手机号MTel、固定电话Tel、邮箱地址Email、籍贯BornAddr、博客名BroadN,指针域:*next;(2)实现创建通讯录链表函数voidBuild(TxlLink&T),输入好友姓名、手机号、固定电话、邮箱地址、籍贯、博客名,建议用文件操作来输入数据;(3)实现函数voidUpdate(TxlLinkT,char*Name,char*MTel),将姓名为Name的好友的手机号改为MTel;(4)实现输出通讯录voidOutPut(TxlLinkT),输出所有好友的姓名、手机号、固定电话、邮箱地址、籍贯、博客名;(5)实现函数voidInsert(TxlLinkT,char*Name,char*MTel),插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名Name的结点放到该结点后面;(6)实现函数voidSort(TxlLinkT),将该通讯录按照好友姓名进行非递减排序;(7)实现函数voidMerge(TxlLink&T1,TxlLink&T2),将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个;(8)实现函数intCount(TxlLinkT);统计籍贯是“广州”的好友人数;(9)实现函数voidMoveK(TxlLinkT,intk),将通讯录中倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序),注意:严禁采用先计算链表长度n再减k(即n-k)的方法;(10)实现函数voidReverseN(TxlLinkT),将通讯录的正中间位置结点之后的全部结点倒置,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法;(11)主控函数main()调用以上函数,分别输出(2)、(3)、(5)、(6)、(7)、(8)、(9)(10)处理后的链表内容、输出籍贯是“广州”的好友人数。#includestdio.h#includestdlib.h#includestring.h#defineNewsp(TxlList*)malloc(sizeof(structTxlList))typedefstructTxlList{charName[16];//姓名charMTel[11];//手机号charTel[9];//固定电话charEMail[16];//邮箱地址charBornAddr[20];//籍贯(值域:北京、上海、大连等等,只写城市名称)charBroadN[50];//博客名structTxlList*next;//指针域}TxlList,*TxlLink;voidLbuild1(TxlLinkT){//创建文件FILE*fp;TxlLinkq;q=Newsp;q=T;intNUM;charfilename[20];printf(\n请输入要创建的通讯表名:\n);gets(filename);if((fp=fopen(filename,wb))==NULL){/*以写方式在当前目录打开(新建)文件*/printf(can'topenfile\n);exit(0);//如果文件无法打开,关闭已经打开的其它文件,结束程序。}printf(请输入要储存的人数:);scanf(%d,NUM);getchar();for(inta=0;aNUM;a++){TxlLinkp;p=Newsp;printf(\n请输入第%d个人的数据,按Enter键结束,数据若为空请输“无”,a+1);printf(\n姓名:);gets(p-Name);printf(手机号:);gets(p-MTel);printf(固定电话:);gets(p-Tel);printf(邮箱地址:);gets(p-EMail);printf(籍贯:);gets(p-BornAddr);printf(博客名:);gets(p-BroadN);q-next=p;q=q-next;if(fprintf(fp,%s%s%s%s%s%s\n,p-Name,p-MTel,p-Tel,p-EMail,p-BornAddr,p-BroadN)==1)//向文件中一次写一个结构体量值{printf(filewriteerror\n);break;}}fclose(fp);}voidLbuild2(TxlLink&T){//读取文件FILE*fp;TxlLinkq;q=Newsp;q=T;charfilename[20];printf(\n请输入要读取的通讯表名:\n);gets(filename);if((fp=fopen(filename,rb))==NULL){printf(can'topenfile\n);exit(0);//如果文件无法打开,关闭已经打开的其它文件,结束程序。}while(!feof(fp)){TxlLinkp;p=Newsp;fscanf(fp,%s%s%s%s%s%s,p-Name,p-MTel,p-Tel,p-EMail,p-BornAddr,p-BroadN);q-next=p;p-next=NULL;q=q-next;}fclose(fp);}voidBuild(TxlLink&T){//选择建立方式的函数intChoice;printf(\n请输入功能编号,运行系统相应功能\n);printf(1-新建通讯录;2-载入以有通讯录;其它-退出。\n选择为:);scanf(%d,&Choice);getchar();switch(Choice){case1:{Lbuild1(T);break;}case2:{Lbuild2(T);break;}default:{printf(无通讯表\n\n);break;}}}voidUpdate(TxlLink&T,char*Name,char*MTel){//将姓名为Name的好友的手机号改为MTel;TxlLinkp;p=T-next;while(p){if(strcmp(p-Name,Name)==0){strcpy(p-MTel,MTel);}p=p-next;}}voidOutPut(TxlLinkT){//输出通讯表数据TxlLinkp;p=Newsp;p=T-next;printf(\n姓名,手机号,固定电话,邮箱地址,籍贯,博客名分别为:\n);while(p){printf(%s%s%s%s%s%s\n,p-Name,p-MTel,p-Tel,p-EMail,p-BornAddr,p-BroadN);p=p-next;}}voidSort(TxlLink&L){//将该通讯录按照好友姓名进行非递减排序TxlLinkp,q,s;q=L;p=L-next-next;q-next-next=NULL;while(p){while(q-next){if(strcmp(q-next-Name,p-Name)=0){s=p;p=p-next;s-next=q-next;q-next=s;q=L;break;}elseif(!q-next-next){s=p;p=p-next;s-next=NULL;q-next-next=s;q=L;break;}elseq=q-next;}}}voidMerge(TxlLink&T1,TxlLink&T2){//将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个Sort(T1);Sort(T2);TxlLinkp,q,r,t,head;p=T1-next;q=T2-next;head=T1;while(p||q){r=p;t=q;if(strcmp(p-Name,q-Name)0){q=q-next;head-next=t;head=head-next;}elseif(strcmp(p-Name,q-Name)0){p=p-next;head-next=r;head=head-next;head-next=NULL;}else{if(strcmp(p-MTel,q-MTel)0){q=q-next;head-next=t;head=head-next;head-next=NULL;}elseif(strcmp(p-MTel,q-MTel)0){p=p-next;head-next=r;head=head-next;head-next=NULL;}else{p=p-next;free(r);}if(!p){while(q){head-next=q;q=q-next;head=head-next;head-next=NULL;}}if(!q){while(p){head-next=p;p=p-next;head=head-next;head-next=NULL;}}}T2=T1;}voidInsert(TxlLink&T,char*Name,char*MTel){//插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名Name的结点放到该结点后面;Sort(T);TxlLinkp,q,r;intn=1;r=Newsp;Buildnew(r);strcpy(r-Name,Name);strcpy(r-MTel,MTel);p=T-next;q=p-next;while(q){if(strcmp(p-Name,r-Name)=0){T-next=r;r-next=p;n=0;break;}if(strcmp(p-Name,r-Name)=0){if(strcmp(q-Name,r-Name)=0){p-next=r;r-next=q;n=0;break;}}p=p-next;q=q-next;}if(n==1){p-next=r;}}intCount(TxlLinkT){//统计籍贯是“...”的好友人数;intx=0;charBornAddr[20];TxlLinkp;p=T-next;printf(请输入要查询的地址:);gets(BornAddr);while(p){if(strcmp(p-BornAddr,BornAddr)==0)x++;p=p-next;}returnx;}voidMoveK(TxlLink&T,intk){//将通讯录中倒数第k个结点之后的所有结点移到头结点后面TxlLinkp,q,r;p=T-next;q=T-next;r=T;for(intx=1;xk;x++){q=q-next;}while(q-next){p=p-next;q=q-next;r=r-next;}q-next=T-next;T-next=p;r-next=NULL;}voidReverseN(TxlLinkT){//将通讯录的正中间位置结点之后的全部结点倒置TxlLinkp,q,r,t,f,z;p=T-next;q=T;r=T;while(q-next){q=q-next;p=p-next;r=r-next;if(q-next==NULL){break;}q=q-next;}t=p;z=t;while(t!=q){t=t-next;f=q-next;q-next=z;z-next=f;z=t;}r-next=q;p-next=NULL;}voidmain(){TxlLinkP;intx=1;inty=1;P=Newsp;intChoice;while(x){printf(\n请输入功能编号,运行系统相应功能\n);printf(1-建立通讯录;2-改手机号;3
本文标题:数据结构以文件设计通讯表
链接地址:https://www.777doc.com/doc-2334006 .html