/*version v3.6 */ #include <iostream> #include <conio.h> #include <windows.h> #include<time.h> #define LIGHT SetConsoleTextAttribute(color1,\ BACKGROUND_RED|\ BACKGROUND_GREEN|\ BACKGROUND_BLUE|\ BACKGROUND_INTENSITY) #define BLW SetConsoleTextAttribute(color1,\ BACKGROUND_RED|\ BACKGROUND_GREEN|\ BACKGROUND_BLUE) #define FRED SetConsoleTextAttribute(color1,\ BACKGROUND_RED|\ BACKGROUND_GREEN|\ BACKGROUND_BLUE|\ BACKGROUND_INTENSITY|\ FOREGROUND_RED|\ FOREGROUND_INTENSITY) #define FBLUE SetConsoleTextAttribute(color1,\ BACKGROUND_RED|\ BACKGROUND_GREEN|\ BACKGROUND_BLUE|\ BACKGROUND_INTENSITY|\ FOREGROUND_BLUE|\ FOREGROUND_INTENSITY) int editBody(char temp [],int flag); void addBody(); int deleteBody(char temp[],int flag); int serchBody(char temp[]); FILE *file; struct stu { struct tm tblock; char group[40]; char name[20]; char email[20]; char adress[60]; char telephone[13]; stu *next; }*fb,*f,*head,*head2,*p,*u; //head用于时间排序时头指针 int haveNum=0; struct fenzu { char gname[40]; struct fenzu *next; }*ghead,*y; void clean() //清空屏幕,并实现动画效果 { int i; for (i=0;i<500;i++) { printf("\n"); } system("cls"); } int serchBody(char temp[]) //查找联系人 { s: clean(); HANDLE color1; color1 = GetStdHandle(STD_OUTPUT_HANDLE); printf("\n\n"); f=head->next; for (;f!=NULL;) //对链表进行检索 { if (strcmp(f->name,temp)==0) { LIGHT; printf(" 序号\t姓名\t 邮箱\t \t\t\t地址\t\t 电话 \n"); printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); printf("\n "); BLW; printf(" %s\t%s\t%s\t%s\n",f->name,f->email,f->adress,f->telephone); LIGHT; printf("\n 添加时间:%d年%d月",f->tblock.tm_year+1900,f->tblock.tm_mon+1); printf("\n"); printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); FBLUE; printf(" 任意键键返回,Esc键退出\n"); LIGHT; printf(" 输入EDIT:修改此联系人\n 输入DELETE:删除此联系人\n "); if(strcmp(f->group,"0")==0) printf("输入Tgroup:移动至分组group\n"); else printf("输入OF:移出分组\n"); char key[20],*key1; scanf("%s",key); if(strcmp(key,"EDIT")==0) { editBody(f->name,1); goto s; } else if(strcmp(key,"DELETE")==0) { deleteBody(f->name,1); getch(); goto s; } else if(key[0]=='T'&&strcmp(key,"T")!=0) { key1=&key[1]; y=ghead->next; while(y!=NULL) { if(strcmp(key1,y->gname)==0) { strcpy(f->group,key1); u=head2->next; while(strcmp(u->name,f->name)!=0) {u=u->next;} strcpy(u->group,key1); goto s; } y=y->next; } FRED; printf("分组未创建!\n"); getch(); goto s; } else if(strcmp(key,"OF")==0) { strcpy(f->group,"0"); u=head2->next; while(strcmp(u->name,f->name)!=0) {u=u->next;} strcpy(u->group,"0"); goto s; } else return 0; } f=f->next; } printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); FRED; printf(" 通讯录中没有此人,任意键返回"); getch(); return 0; } struct stu sh(int flag) { struct stu oo; char qc; HANDLE color1; color1 = GetStdHandle(STD_OUTPUT_HANDLE); if(flag==1) goto inputemail; inputname: LIGHT; printf(" "); BLW; printf("姓名"); LIGHT; printf(":"); scanf("%s",oo.name); p=head->next; while(p!=NULL) { if(strcmp(p->name,oo.name)==0) { printf(" 联系人已存在!是否修改?(y:修改,任意键返回)\n"); qc=getch(); if(qc=='y'||qc=='Y') { editBody(oo.name,1); oo.tblock.tm_min=30; return oo; } else { goto inputname; } } p=p->next; } inputemail: //用于输入错误时的返回 LIGHT; printf("\n "); BLW; printf("邮箱地址"); LIGHT; printf(":"); scanf("%s",oo.email); if(strlen(oo.email)!=0) { if(strchr( oo.email,'@' )==NULL) { FRED; printf("\n\t请输入正确的邮箱地址!(例如:[email protected])\n"); goto inputemail; //返回到输入邮箱 } } printf("\n "); BLW; printf("地址"); LIGHT; printf(":"); scanf("%s",oo.adress); printf("\n "); BLW; printf("电话"); LIGHT; printf(":"); scanf("%s",oo.telephone); return oo; } int editBody(char temp [], int flag) //编辑联系人 { clean(); HANDLE color1; color1 = GetStdHandle(STD_OUTPUT_HANDLE); printf("\n\n"); f=head->next; p=head2->next; char a; for (;f!=NULL;) //对链表进行检索 { if (strcmp(f->name,temp)==0) { if (flag==1) goto e; printf(" 找到联系人 "); FRED; printf("%s",temp); LIGHT; printf(",确认修改请按y/Y\n\n"); a=getch(); if (a=='y'||a=='Y') { e: for (;p!=NULL;) { if (strcmp(p->name,temp)==0) { break; } else p=p->next; } struct stu l; fb=p; l=sh(1); p=fb; strcpy(p->email,l.email); strcpy(f->email,l.email); strcpy(p->adress,l.adress); strcpy(f->adress,l.adress); strcpy(p->telephone,l.telephone); strcpy(f->telephone,l.telephone); } return 0; } f=f->next; } printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); FRED; printf(" 未找到此人,请重新输入"); getch(); return 0; } int showBody(char bit[],int kb) //显示所有联系人 { char c; HANDLE color1; color1 = GetStdHandle(STD_OUTPUT_HANDLE); char *name1,name2[20]; shijian: int i,up=0,op=9999; clean(); printf("\n\n"); LIGHT; printf(" 分组:\n"); y=ghead->next; while(y!=NULL) { LIGHT; printf(" "); if(strcmp(bit,y->gname)==0) BLW; printf("%s\n",y->gname); y=y->next; } LIGHT; printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); printf("\n\n"); f=head; printf(" 序号\t姓名\t 邮箱\t \t\t地址\t\t 电话 \n"); printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); for (i=0;i<haveNum;i++) { f=f->next; if(strcmp(f->group,bit)==0||kb==0) { LIGHT; printf("\n "); BLW; if(f->tblock.tm_year!=up||f->tblock.tm_mon!=op) { printf("%d/%d\n",1900+f->tblock.tm_year,f->tblock.tm_mon+1); up=f->tblock.tm_year; op=f->tblock.tm_mon; } LIGHT; printf(" "); BLW; printf("\t%s\t%s \t%s\t%s\n",f->name,f->email,f->adress,f->telephone); } } LIGHT; printf("\n ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n\n"); FBLUE; printf(" 按 / 键切换至姓名排列\n"); LIGHT; printf("请输入以下指令进行操作:\n Dname:删除联系人name\t\t"); if(kb==0) printf(" bgroup:创建分组名group"); printf("\n Ename:修改联系人name\t\t"); if(kb==0) printf(" dgroup:删除group分组 "); printf("\n Sname:查找联系人name\t\t"); if(kb==0) printf(" ogroup:打开分组group"); printf("\n ADD:添加新联系人\t\t"); if(kb==1) printf(" close:关闭分组\n"); if(kb==0) printf(" XIT:保存并退出\n"); c=getch(); if(c=='/') goto xingming; scanf("%s",name2); if(name2[0]=='D'&&strcmp(name2,"D")!=0) { name1=&name2[1]; deleteBody(name1,0); getch(); clean(); } else if(name2[0]=='E'&&strcmp(name2,"E")!=0) { name1=&name2[1]; editBody(name1,0); clean(); } else if(strcmp(name2,"ADD")==0) { clean(); printf("\n\n"); addBody(); clean(); } else if(name2[0]=='S'&&strcmp(name2,"S")!=0) { name1=&name2[1]; serchBody(name1); clean(); } else if(strcmp(name2,"XIT")==0) { return 0; } else if(kb==0) { if(name2[0]=='b'&&strcmp(name2,"b")!=0) { name1=&name2[1]; y=ghead; while(y->next!=NULL) y=y->next; y->next=(struct fenzu*)malloc(sizeof(struct fenzu)); y=y->next; strcpy(y->gname,name1); y->next=NULL; } else if(name2[0]=='d'&&strcmp(name2,"d")!=0) { name1=&name2[1]; struct fenzu *t; t=ghead; y=ghead->next; while(y!=NULL) { if(strcmp(y->gname,name1)==0) { printf("sss"); t->next=y->next; f=head->next; while(f!=NULL) { if(strcmp(f->group,name1)==0) strcpy(f->group,"0"); f=f->next; } f=head2->next; while(f!=NULL) { if(strcmp(f->group,name1)==0) strcpy(f->group,"0"); f=f->next; } free(y); break; } else { t=t->next; y=y->next; } } } else if(name2[0]=='o'&&strcmp(name2,"o")!=0) { name1=&name2[1]; showBody(name1,1); } } else if(kb==1) { if(strcmp(name2,"close")==0) { return 0; } } goto shijian; xingming: f=head2; clean(); LIGHT; printf("\n\n"); printf(" 分组:\n"); y=ghead->next; while(y!=NULL) { LIGHT; printf(" "); if(strcmp(bit,y->gname)==0) BLW; printf("%s\n",y->gname); y=y->next; } LIGHT; printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); printf("\n\n"); printf(" 序号\t姓名\t 邮箱\t \t\t地址\t\t 电话 \n"); printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); char cdc='0'; for (i=0;i<haveNum;i++) { f=f->next; if(strcmp(f->group,bit)==0||kb==0) { LIGHT; printf("\n "); BLW; if(strcmp(f->name,"啊")>=0&&strcmp(f->name,"芭")<0&&cdc!='a') { printf(" A \n"); cdc='a'; } else if(strcmp(f->name,"芭")>=0&&strcmp(f->name,"擦")<0&&cdc!='b') { printf(" B \n"); cdc='b'; } else if(strcmp(f->name,"擦")>=0&&strcmp(f->name,"搭")<0&&cdc!='c') { printf(" C \n"); cdc='c'; } else if(strcmp(f->name,"搭")>=0&&strcmp(f->name,"蛾")<0&&cdc!='d') { printf(" D \n"); cdc='d'; } else if(strcmp(f->name,"蛾")>=0&&strcmp(f->name,"发")<0&&cdc!='e') { printf(" E \n"); cdc='e'; } else if(strcmp(f->name,"发")>=0&&strcmp(f->name,"噶")<0&&cdc!='f') { printf(" F \n"); cdc='f'; } else if(strcmp(f->name,"噶")>=0&&strcmp(f->name,"哈")<0&&cdc!='g') { printf(" G \n"); cdc='g'; } else if(strcmp(f->name,"哈")>=0&&strcmp(f->name,"击")<0&&cdc!='h') { printf(" H \n"); cdc='h'; } else if(strcmp(f->name,"击")>=0&&strcmp(f->name,"喀")<0&&cdc!='j') { printf(" J \n"); cdc='j'; } else if(strcmp(f->name,"喀")>=0&&strcmp(f->name,"垃")<0&&cdc!='k') { printf(" K \n"); cdc='k'; } else if(strcmp(f->name,"垃")>=0&&strcmp(f->name,"妈")<0&&cdc!='l') { printf(" L \n"); cdc='l'; } else if(strcmp(f->name,"妈")>=0&&strcmp(f->name,"拿")<0&&cdc!='m') { printf(" M \n"); cdc='m'; } else if(strcmp(f->name,"拿")>=0&&strcmp(f->name,"哦")<0&&cdc!='n') { printf(" N \n"); cdc='n'; } else if(strcmp(f->name,"哦")>=0&&strcmp(f->name,"啪")<0&&cdc!='o') { printf(" O \n"); cdc='o'; } else if(strcmp(f->name,"啪")>=0&&strcmp(f->name,"期")<0&&cdc!='p') { printf(" P \n"); cdc='p'; } else if(strcmp(f->name,"期")>=0&&strcmp(f->name,"然")<0&&cdc!='q') { printf(" Q \n"); cdc='q'; } else if(strcmp(f->name,"然")>=0&&strcmp(f->name,"撒")<0&&cdc!='r') { printf(" R \n"); cdc='r'; } else if(strcmp(f->name,"撒")>=0&&strcmp(f->name,"塌")<0&&cdc!='s') { printf(" S \n"); cdc='s'; } else if(strcmp(f->name,"塌")>=0&&strcmp(f->name,"挖")<0&&cdc!='t') { printf(" T \n"); cdc='t'; } else if(strcmp(f->name,"挖")>=0&&strcmp(f->name,"昔")<0&&cdc!='w') { printf(" W \n"); cdc='w'; } else if(strcmp(f->name,"昔")>=0&&strcmp(f->name,"压")<0&&cdc!='x') { printf(" X \n"); cdc='x'; } else if(strcmp(f->name,"压")>=0&&strcmp(f->name,"匝")<0&&cdc!='y') { printf(" Y \n"); cdc='y'; } else if(strcmp(f->name,"匝")>=0&&strcmp(f->name,"座")<=0&&cdc!='z') { printf(" Z \n"); cdc='z'; } else if(cdc=='0') { printf(" # \n"); cdc='1'; } LIGHT; printf(" "); BLW; printf("\t%s\t%s \t%s\t%s\n",f->name,f->email,f->adress,f->telephone); } } LIGHT; printf("\n ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n\n"); FBLUE; printf(" 按 / 键切换至时间排列\n"); LIGHT; printf("请输入以下指令进行操作:\n Dname:删除联系人name\t\t"); if(kb==0) printf(" bgroup:创建分组名group"); printf("\n Ename:修改联系人name\t\t"); if(kb==0) printf(" dgroup:删除group分组 "); printf("\n Sname:查找联系人name\t\t"); if(kb==0) printf(" ogroup:打开分组group"); printf("\n ADD:添加新联系人\t\t"); if(kb==1) printf(" close:关闭分组\n"); if(kb==0) printf(" XIT:保存并退出\n"); c=getch(); if(c=='/') goto shijian; scanf("%s",name2); if(name2[0]=='D'&&strcmp(name2,"D")!=0) { name1=&name2[1]; deleteBody(name1,0); getch(); clean(); } else if(name2[0]=='E'&&strcmp(name2,"E")!=0) { name1=&name2[1]; editBody(name1,0); clean(); } else if(strcmp(name2,"ADD")==0) { clean(); printf("\n\n"); addBody(); clean(); } else if(name2[0]=='S'&&strcmp(name2,"S")!=0) { name1=&name2[1]; serchBody(name1); clean(); } else if(strcmp(name2,"XIT")==0) { return 0; } else if(kb==0) { if(name2[0]=='b'&&strcmp(name2,"b")!=0) { name1=&name2[1]; y=ghead; while(y->next!=NULL) y=y->next; y->next=(struct fenzu*)malloc(sizeof(struct fenzu)); y=y->next; strcpy(y->gname,name1); y->next=NULL; } else if(name2[0]=='d'&&strcmp(name2,"d")!=0) { name1=&name2[1]; struct fenzu *t; t=ghead; y=ghead->next; while(y!=NULL) { if(strcmp(y->gname,name1)==0) { printf("sss"); t->next=y->next; f=head->next; while(f!=NULL) { if(strcmp(f->group,name1)==0) strcpy(f->group,"0"); f=f->next; } f=head2->next; while(f!=NULL) { if(strcmp(f->group,name1)==0) strcpy(f->group,"0"); f=f->next; } free(y); break; } else { t=t->next; y=y->next; } } } else if(name2[0]=='o'&&strcmp(name2,"o")!=0) { name1=&name2[1]; showBody(name1,1); } } else if(kb==1) { if(strcmp(name2,"close")==0) { return 0; } } goto xingming; } int deleteBody(char temp[],int flag) //删除联系人 { clean(); HANDLE color1; color1 = GetStdHandle(STD_OUTPUT_HANDLE); f=head->next; fb=head; p=head2->next; u=head2; char a; for (;f!=NULL;) //判断链表中是否有内容 { if (strcmp(f->name,temp)==0) { if(flag==1) goto de; printf("\n"); FRED; printf(" 找到 %s,确定删除请按y/Y,任意键返回\n",temp); a=getch(); if (a=='y'||a=='Y') { de: fb->next=f->next; free(f); system("color F0"); clean(); printf("\n\n"); printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); printf(" \n 删除成功!\n\n "); FBLUE; printf("任意键返回,Esc键退出"); for (;p!=NULL;) //判断链表中是否有内容 { if (strcmp(p->name,temp)==0) { u->next=p->next; free(p); goto fanhui; } else { u=u->next; p=p->next; } } fanhui: haveNum--; return 0; } else return 0; } else { fb=fb->next; f=f->next; } } printf("\n"); FRED; printf(" 通讯录中没有此人,任意键返回\n"); return 0; } void addBody() // 添加联系人 { printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); f=(struct stu*)malloc(sizeof(struct stu)); u=(struct stu*)malloc(sizeof(struct stu)); struct stu l; l=sh(0); if(l.tblock.tm_min==30) return; strcpy(u->name,l.name); strcpy(f->name,l.name); strcpy(u->email,l.email); strcpy(f->email,l.email); strcpy(u->adress,l.adress); strcpy(f->adress,l.adress); strcpy(u->telephone,l.telephone); strcpy(f->telephone,l.telephone); strcpy(f->group,"0"); time_t timer; timer=time(NULL); struct tm *dddd; dddd=localtime(&timer); f->tblock=*dddd; u->tblock=*dddd; haveNum++; p=head; fb=head->next; if(fb!=NULL) // 找到第一次大于输入的元素时间的位置 { while(fb!=NULL&&fb->tblock.tm_year<f->tblock.tm_year) { p=p->next; fb=fb->next; } while(fb!=NULL&&fb->tblock.tm_mon<f->tblock.tm_mon) { p=p->next; fb=fb->next; } } p->next=f; f->next=fb; fb=head2->next; f=head2; if(fb!=NULL) // 找到第一次大于输入的元素的位置 { while(fb!=NULL&&strcmp(fb->name,u->name)<0) { f=f->next; fb=fb->next; } } f->next=u; u->next=fb; printf("\n 添加成功!任意键返回"); getch(); } int main() //程序入口 { static char *pl,p2[50]; pl=p2; head=(struct stu*)malloc(sizeof(struct stu)); head->next=NULL; head2=(struct stu*)malloc(sizeof(struct stu)); head2->next=NULL; ghead=(struct fenzu*)malloc(sizeof(struct fenzu)); ghead->next=NULL; if((file=fopen("e:\\records.txt","rt"))!=NULL) //对head读取磁盘中的数据 { f=head; while(!feof(file)) { p=(struct stu *) malloc(sizeof(struct stu)); f->next=p; fscanf(file," %s %d %d %s %s %s %s ",p->group,&p->tblock.tm_year,&p->tblock.tm_mon,p->name,p->email,p->adress,p->telephone); haveNum++; f=p; } p->next=NULL; fclose(file); } if((file=fopen("e:\\records2.txt","rt"))!=NULL) //对head2读取磁盘中的数据 { f=head2; while(!feof(file)) { p=(struct stu *) malloc(sizeof(struct stu)); f->next=p; fscanf(file," %s %d %d %s %s %s %s ",p->group,&p->tblock.tm_year,&p->tblock.tm_mon,p->name,p->email,p->adress,p->telephone); f=p; } p->next=NULL; fclose(file); } system("color F0"); showBody("dfdf",0); p=head->next; file=fopen("e:\\records.txt","w");// 将数据保存 while(p!=NULL) { fprintf(file," %s %d %d %s %s %s %s ",p->group,p->tblock.tm_year,p->tblock.tm_mon,p->name,p->email,p->adress,p->telephone); p=p->next; } fclose(file); //关闭文件 p=head2->next; file=fopen("e:\\records2.txt","w");// 将数据保存 while(p!=NULL) { fprintf(file," %s %d %d %s %s %s %s ",p->group,p->tblock.tm_year,p->tblock.tm_mon,p->name,p->email,p->adress,p->telephone); p=p->next; } fclose(file); y=ghead->next; file=fopen("e:\\group.txt","w"); while(y!=NULL) { fprintf(file," %s ",y->gname); y=y->next; } fclose(file); exit(0); return 0; }