1、stdlib.hstring.h#define Newsp (TxlList *)malloc(sizeof(struct TxlList)typedef struct TxlList char Name16; /姓名 char MTel11; /手机号 char Tel9; /固定电话 char EMail16; /邮箱地址 char BornAddr20; /籍贯(值域:北京、上海大连等等,只写城市名称) char BroadN50; /博客名 struct TxlList *next; /指针域 TxlList, *TxlLink;void Lbuild1(TxlLink &T)/创建文
2、件 FILE *fp; TxlLink q; q=Newsp; q=T; int NUM; char filename20; printf(n*请输入要创建的通讯录名:n); gets(filename); if (fp=fopen(filename, wb)=NULL) /*以写方式在当前目录打开(新建)文件*/ printf(cant open filen exit(0); /如果文件无法打开,关闭已经打开的其它文件,结束程序。 printf(*请输入要储存的人数: scanf(%d,&NUM); getchar(); for(int a=0;aName);*手机号:MTel);*固定电话
3、:Tel);*邮箱地址:EMail);*籍贯:BornAddr);*博客名:BroadN); p-next=NULL; q-next=p; q=q-next; if (fprintf(fp,%s %s %s %s %s %sn,p-Name,p-MTel,p-Tel,p-EMail,p-BornAddr,p-BroadN)=1)/向文件中一次写一个结构体量值 printf(file write errorn break; fclose(fp);void Lbuild2(TxlLink &T)/读取文件 TxlLink q; q=Newsp; q=T; char filename20; prin
4、tf(n*请输入要读取的通讯表名: gets(filename); if(fp=fopen(filename,rb)=NULL) exit(0); while(!feof(fp) TxlLink p; p=Newsp; fscanf(fp,%s %s %s %s %s %s q- p- q=q- fclose(fp);void Build(TxlLink &T)/选择建立方式的函数 int Choice;*) ;n*请输入想要实现的功能编号:*1.新建通讯录;n*2.输出已有有通讯录;n*其它-退出。n*选择为: scanf(Choice); getchar(); switch(Choice)
5、 case 1: Lbuild1(T); break; case 2: Lbuild2(T); break; default: 无通讯录nn break; void Update(TxlLink &T, char *Name, char *MTel)/将姓名为Name的好友的手机号改为MTel; TxlLink p; p=T- while(p) if(strcmp(p-Name,Name)=0) strcpy(p-MTel,MTel); p=p-void Buildnew(TxlLink &T)/创建一个空资料单元 char a=无; strcpy(T-Name,a);MTel,a);EMai
6、l,a);BornAddr,a);BroadN,a);Tel,a); T-void OutPut(TxlLink T)/输出通讯表数据 p=Newsp;n*通讯录信息:n姓名,手机号,固定电话,邮箱地址,籍贯,博客名分别为:void Sort(TxlLink &T) /将该通讯录按照好友姓名进行非递减排序 TxlLink p,q,r; p=T; q=p- int SUM=0; while(q)/记录通讯表数据个数 SUM+; q=q- for(int i=0;iSUM;i+) for(int j=0;j if(r) if(strcmp(q-Name,r-Name)0) next=r;next=
7、r- r-next=q; p=p- q=p- p=T; q=p- r=q-void Merge(TxlLink &T1, TxlLink &T2) /将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个 Sort(T1); Sort(T2); TxlLink p,q,r,t,head; p=T1- q=T2- head=T1; while(p|q) r=p; t=q; if(strcmp(p-Name,q-0) head-next=t; head=head-w else if(strcmp(p-Name)MTel)0) q=q- head- head=he
8、ad- else if(strcmp(p-MTel)Name的结点放到该结点后面; Sort(T); int n=1; r=Newsp; Buildnew(r); strcpy(r-Name,Name); while(q)=0) T- r- n=0;=0) n=0; if(n=1) p-int Count(TxlLink T)/统计籍贯是某地的好友人数; int x=0; char BornAddr20;*请输入要查询的地址: gets(BornAddr);BornAddr,BornAddr)=0) x+; return x;int Number1(TxlLink p,TxlLink &r,T
9、xlLink &t,int k)/运用递归方法找到倒数第k个结点的地址 if(p) q=p; x=Number1(p,r,t,k)+1; if(k=x) r=q; if(k+1)=x) t=q;int Number2(TxlLink p,TxlLink &t,int &k)/运用递归方法找到倒数第k个的地址 k+; x=Number2(p,r,t,k)+1; if(k/2)=x) if(k/2+1)=x)void MoveK(TxlLink &T, int k)/将通讯录中倒数第k个结点之后的所有结点移到头结点后面 int x; TxlLink p,q,r,t; x=Number1(p,r,t
10、,k); t- while(r) q=r; r=r- q-void ReverseN(TxlLink T)/将通讯录的正中间位置结点之后的全部结点倒置 int k=0; Number2(p,r,t,k);int main(void) TxlLink P; int x=1; P=Newsp; Build(P); while(x)*1.排序;n*2.插入信息;n*3.更改手机;n*4.合并;n*5.统计籍贯人数;n*6.移节点;n*7.倒置链表;n*其它退出。 switch(Choice) case 1:n*排序前的通讯表*n OutPut(P); Sort(P);n*排序后的通讯表*n case
11、 2:n*插入前的通讯录*n OutPut(P); char name16,mtel11;n*请输入要插入的好友姓名: gets(name);n*请输入要插入的好友号码: gets(mtel); Insert(P,name,mtel);n*插入后的通讯录*n* case 3:n*改写前的通讯录*nn*请输入要改写的好友姓名:n*请输入要改写的好友号码: Update(P,name,mtel);n*改写后的通讯录*n case 4: TxlLink Q; Q=Newsp;n*建立另一个通讯录n Build(Q);n*第一个通讯录nn*第二个通讯录n OutPut(Q); Merge(P,Q);n*合并并排序后的通讯录*n case 5: int N;n*输出通讯录*n N=Count(P);n*统计结果为:n*共%d个人n,N); case 6: int n;n*请输入移动节点数:n n=n);n*移动前的通讯录: MoveK(P,n);n*移动后的通讯录: case 7:n*倒置前的通讯录*n ReverseN(P);n*倒置后的通讯录*n default: x=0; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1