C语言通讯录源代码

时间:2025-03-18 07:26:37
/***************************************************** File name:tong_xun_lu.c Author: Tang Zhiqian Date:2017-07-26 20:29 *****************************************************/ #include <> #include <> #include <> #include <> #define FALSE 0; #define TRUE 1; typedef int ElemType; typedef int Status; typedef struct st { char num[20]; char name[30]; char telephone[20]; char address[50]; char email[30]; struct st *next; }Friend; void Pos(int x, int y); Status init(Friend **head); //初始化 Status Add_tail(Friend *head); //新建联系人 void Output (Friend *head); //输出到屏幕 Status Read_file(Friend *head); //读文件 void Search(Friend *head); //查找 Status Delete(Friend *head); //删除 Status update(Friend *head); //修改联系人信息 void Output_file(Friend *head); //输出到文件 void clear(Friend **head); //清空 void Insert_Sort(Friend *head); //根据学号排序 int main() { struct tm *t; time_t tt; time(&tt); t = localtime(&tt); //为了打印出系统当前时间 Friend *head; init(&head); Read_file(head); int choose; while(1) { printf("\n\n\n\n"); printf(" *********************************************\n"); printf(" * 主菜单 *\n"); printf(" * 输入数字执行操作: *\n"); printf(" * 1:查看联系人 4.更改联系人信息 *\n"); printf(" * 2:新建联系人 5.删除联系人 *\n"); printf(" * 3:查找联系人 0:退出 *\n"); printf(" * *\n"); printf(" * 操作时间:%4d%02d%2d%02d:%02d:%02d *\n", t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); printf(" *********************************************\n"); printf("\n\n"); scanf("%d",&choose); switch(choose) { case 1: Insert_Sort(head); Output(head); //Output_file(head); break; case 2: Add_tail(head); Output_file(head); break; case 3: Search(head); break; case 4: update(head); Output_file(head); break; case 5: Delete(head); Output_file(head); break; case 0: clear(&head); break; default: printf("输入错误,重新输入!\n"); break; } if (choose == 0) { break; } getchar(); } return 0; } Status init(Friend **head) { Friend *newfriend = (Friend *) malloc (sizeof(Friend)); if (newfriend == NULL) { return FALSE; } newfriend->next = NULL; *head = newfriend; return TRUE; } Status Read_file(Friend *head) { int flag; Friend *newfriend,*p; FILE *fp; p = head; fp = fopen("/mnt/hgfs/share/tong_xun_lu_a.txt","r"); fscanf(fp,"%d",&flag); while(flag != 0) { p = head; newfriend = (Friend *) malloc (sizeof(Friend)); if (newfriend == NULL) { return FALSE; } while(p->next) { p=p->next; } newfriend->next = NULL; p->next = newfriend; fscanf(fp,"%s%s%s%s%s",newfriend->num,newfriend->name,newfriend->telephone, newfriend->address,newfriend->email); fscanf(fp,"%d",&flag); } fclose(fp); return TRUE; } Status Add_tail(Friend *head) { Friend *p; Friend *newfriend = (Friend *) malloc (sizeof(Friend)); if (newfriend == NULL) { return FALSE; } p = head; while(p->next) { p = p->next; } printf("\n\n请输入新建联系人的学号,姓名,电话号码,地址,email:\n\n\n\n"); scanf("%s%s%s%s%s",newfriend->num,newfriend->name,newfriend->telephone,newfriend->address,newfriend->email); newfriend->next = p->next; p->next = newfriend; printf("添加联系人成功!\n"); return TRUE; } void Search(Friend *head) { int choose,flag = 0; Friend *q = head; char array[50]; while(1) { printf(" **********************************************\n"); printf(" * 请选择查找方式: *\n"); printf(" * 1:根据姓名查找 3.根据地址查找 *\n"); printf(" * 2:根据号码查找 4.根据email查找 *\n"); printf(" * 5:根据学号查找 0:返回上一级菜单 *\n"); printf(" **********************************************\n"); scanf("%d",&choose); switch(choose) { case 1: flag = 0; printf("请输入要查找联系人的姓名:\n\t\t\t"); scanf("%s",array); while(q->next) { if (strcmp(q->next->name,array) == 0) { flag = 1; printf("找到该联系人:\n\n"); printf(" 学号:%s\t 姓名:%s\t 号码:%s\t 地址:%s\t Email:%s\n\n\n",q->next->num, q->next->name,q->next->telephone,q->next->address,q->next->email); } q = q->next; } if(flag == 0) { printf(" 查无此人!\n"); } q = head; break; case 2: flag = 0; printf("请输入要查找联系人的号码:\n\t\t\t"); scanf("%s",array); while(q->next) { if (strcmp(q->next->telephone,array) == 0) { flag = 1; printf("找到该联系人:\n\n"); printf(" 学号:%s\t 姓名:%s\t 号码:%s\t 地址:%s\t Email:%s\n\n\n",q->next->num, q->next->name,q->next->telephone,q->next->address,q->next->email); } q = q->next; } if(flag == 0) { printf(" 查无此人!\n"); } q = head; break; case 3: flag = 0; printf("请输入要查找联系人的地址:\n\t\t\t"); scanf("%s",array); while(q->next) { if (strcmp(q->next->address,array) == 0) { flag = 1; printf("找到该联系人:\n\n"); printf(" 学号:%s\t 姓名:%s\t 号码:%s\t 地址:%s\t Email:%s\n\n\n",q->next->num, q->next->name,q->next->telephone,q->next->address,q->next->email); } q = q->next; } if(flag == 0) { printf(" 查无此人!\n"); } q = head; break; case 4: flag = 0; printf("请输入要查找联系人的email:\n\t\t\t"); scanf("%s",array); while(q->next) { if (strcmp(q->next->email,array) == 0) { flag = 1; printf("找到该联系人:\n\n"); printf(" 学号:%s\t 姓名:%s\t 号码:%s\t 地址:%s\t Email:%s\n\n\n",q->next->num, q->next->name,q->next->telephone,q->next->address,q->next->email); } q = q->next; } if(flag == 0) { printf(" 查无此人!\n"); } q = head; break; case 5: flag = 0; printf("请输入要查找联系人的学号:\n\t\t\t"); scanf("%s",array); while(q->next) { if (strcmp(q->next->num,array) == 0) { flag = 1; printf("找到该联系人:\n\n"); printf(" 学号:%s\t 姓名:%s\t 号码:%s\t 地址:%s\t Email:%s\n\n\n",q->next->num, q->next->name,q->next->telephone,q->next->address,q->next->email); } q = q->next; } if(flag == 0) { printf(" 查无此人!\n"); } q = head; break; case 0: break; default: printf("输入错误,重新输入!\n"); break; } if (choose == 0) { break; } getchar(); } } void Output (Friend *head) { int i = 0; if (head->next == NULL) { printf("无联系人信息!\n"); } else { printf("\n\n\n\n\n\n\n"); printf(" 联系人信息:\n\n"); while(head->next) { printf(" 学号:%s\t 姓名:%s\t 号码:%s\t 地址:%s\t Email:%s\n" ,head->next->num,head->next->name,head->next->telephone,head->next->address,head->next->email); head = head->next; i++; } printf("\n\n\n"); } } Status update(Friend *head) { int flag = 0; Friend *q = head; Friend *p = (Friend *) malloc (sizeof(Friend)); if (p == NULL) { return FALSE; } printf("请输入要修改联系人的姓名: "); scanf("%s",p->name); while(q->next) { if (strcmp(q->next->name,p->name) == 0) { flag = 1; printf("输入要修改的信息:\n\t\t"); scanf("%s%s%s%s%s",q->next->num,q->next->name,q->next->telephone,q->next->address,q->next->email); printf(" 修改成功!\n"); } q = q->next; } if (flag == 0) { printf(" 查无此人!\n"); return FALSE; } free(p); return TRUE; } void Output_file(Friend *head) { FILE *fp; int k = 1; fp = fopen("/mnt/hgfs/share/tong_xun_lu_a.txt","w+"); while(head->next) { fprintf(fp, "%d ",k++); //输出的时候在每个联系人前面输个序号 fprintf(fp,"%s %s %s %s %s\r\n" ,head->next->num,head->next->name,head->next->telephone,head->next->address,head->next->email); head = head->next; } fprintf(fp, "%d\n",0); fclose(fp); } Status Delete(Friend *head) { int flag = 0; Friend *p = head; //Friend *temp; char name[50]; printf("请输入要删除联系人的姓名:\n\t\t\t"); scanf("%s",name); while(p->next) { if (strcmp(p->next->name,name) == 0) { flag++; } p = p->next; } if (flag == 0) { printf(" 查无此人!\n"); } if (flag == 1) { p = head; while(p->next) { if (strcmp(p->next->name,name) == 0) { Friend *temp = p->next; p->next = temp->next; free(temp); printf("删除成功!\n"); } else { p = p->next; } } } if (flag > 1) { printf("\n\n\n您要删除的联系人不止一位,请输入您要删除联系人的学号:\n\n"); char num[20]; p = head; while(p->next) { if (strcmp(p->next->name,name) == 0) { printf(" 学号:%s\t 姓名:%s\t 号码:%s\t 地址:%s\t Email:%s\n",p->next->num, p->next->name,p->next->telephone,p->next->address,p->next->email); } p = p->next; } scanf("%s",num); p = head; while(p->next) { if (strcmp(p->next->num,num) == 0) { Friend *temp = p->next; p->next = temp->next; free(temp); printf("删除成功!\n"); } else { p = p->next; } } } return TRUE; } void clear(Friend **head) { Friend *temp; while((*head)->next) { temp = (*head)->next; (*head)->next = (*head)->next->next; free(temp); } free(*head); } void Insert_Sort(Friend *head) { Friend *p; if (head->next->next == NULL || head->next == NULL) { return; } Friend *head2 = head->next->next; Friend *q; head->next->next = NULL; while(head2) { p = head; q = head2; head2 = head2->next; while(p->next) { if (strcmp(q->num,p->next->num) > 0) { p = p->next; } else break; } q->next = p->next; p->next = q; } }