1.对通讯录加入可以把联系人存入文件中,也可以从文件中读取联系人的信息。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> //**********联系人的信息********** struct person { char name[32]; int age; char sex[4]; char phone[12]; char address[100]; }; struct student { struct person man; struct student *next; }; void Menu() { printf("***********************************************\n"); printf("****1. 添加指定联系人 2. 删除指定联系人 ****\n"); printf("****3. 修改指定联系人 4. 显示所有联系人 ****\n"); printf("****5. 查找指定联系人 6. 清空所有联系人 ****\n"); printf("****7. 按名字排序 0. 退出 ****\n"); printf("****8. 将信息存入文件中 9. 从文件中读取信息****\n"); printf("***********************************************\n"); } //*************添加联系人***************** void Insert(struct student **p) { int i = 0; int n = 0; struct student *q = (*p); printf("请输入要添加联系人的个数:"); scanf("%d", &n); for(i = 0; i < n; i++) { q = malloc(sizeof(struct student)); printf("\n请输入联系人的名字:"); scanf("%s", q->man.name); printf("\n请输入联系人的年龄:"); scanf("%d", &q->man.age ); printf("\n请输入联系人的性别:"); scanf("%s", q->man.sex ); printf("\n请输入联系人的电话:"); scanf("%s", q->man.phone); printf("\n请输入联系人的地址:"); scanf("%s", q->man.address); q->next = *p; *p = q; } } //***********显示所有联系人************ void show(struct student *p) { do { if(p == NULL) { printf("您的通信录为空\n"); break; } printf("姓名为%s 年龄为%d 性别为%s 电话为%s 住址为%s\n", p->man.name,p->man.age,p->man.sex,p->man.phone,p->man.address); p = p->next; }while(p != NULL); } //**************删除指定联系人************ void Drop(struct student **p) { char a[20] = "0"; struct student *q = *p; struct student *head = *p; assert(*p); printf("请输入你要删除的姓名:"); scanf("%s", a); while(1) { if(!strcmp(q->man.name,a)) { if(head == q)//删除第一个联系人 { *p = (*p)->next; } else { head->next = q->next; } break; } head = q; q = q->next; } free(q); } //***********修改指定联系人的信息********** void Amend(struct student **p) { char a[20] = "0"; struct student *q = (*p) ; assert(*p); printf("请输入要修改的联系人的姓名:"); scanf("%s", a); while(q != NULL) { if((!strcmp(q->man.name,a))&& q != NULL) { printf("\n请输入新联系人的名字:"); scanf("%s", q->man.name); printf("\n请输入新联系人的年龄:"); scanf("%d", &q->man.age); printf("\n请输入新联系人的性别:"); scanf("%s", q->man.sex); printf("\n请输入新联系人的电话:"); scanf("%s", q->man.phone); printf("\n请输入新联系人的地址:"); scanf("%s", q->man.address); break; } q = q->next; } if(q == NULL) { printf("通信录中没有这个人\n"); } } //*************查找指定联系人************* void Find(struct student *p) { char a[20] = "0"; struct student *q = p; assert(p); printf("请输入你要查找的姓名:"); scanf("%s", a); while(q != NULL) { if(!strcmp(q->man.name,a)&& q != NULL) { printf("姓名为%s 年龄为%d 性别为%s 电话号为%s 住址为%s\n", q->man.name,q->man.age,q->man.sex,q->man.phone,q->man.address); break; } q = q->next; } if(q == NULL) { printf("查无此人\n"); } } //**************交换两个结构体里的内容*********** void Exchange(struct student **p,struct student **head) { struct student *a = (struct student *)malloc(sizeof(struct student)); strcpy(a->man.name , (*p)->man.name); strcpy((*p)->man.name , (*head)->man.name); strcpy((*head)->man.name , a->man.name); a->man.age = (*p)->man.age; (*p)->man.age = (*head)->man.age; (*head)->man.age = a->man.age; strcpy(a->man.sex , (*p)->man.sex); strcpy((*p)->man.sex , (*head)->man.sex); strcpy((*head)->man.sex , a->man.sex); strcpy(a->man.phone , (*p)->man.phone); strcpy((*p)->man.phone , (*head)->man.phone); strcpy((*head)->man.phone , a->man.phone); strcpy(a->man.address , (*p)->man.address); strcpy((*p)->man.address , (*head)->man.address); strcpy((*head)->man.address , a->man.address); free(a); a = NULL; } //**********按名字对所有联系人排序********** void Sort(struct student **p) { struct student *q = (*p); struct student *head = q; assert(*p); while(q!=NULL) { head = q; while(head != NULL) { if(strcmp(q->man.name ,head->man.name)>0) { Exchange(&q,&head);//交换两结构体内的东西 } head = head->next; } q = q->next; } } //***********释放所有动态内存开辟的空间*********** void Allfree(struct student **p) { struct student *q = (*p); while(q != NULL) { q = (*p)->next; free(*p); *p = NULL; q = *p; } } //*************写入文件中************ void Save(struct student *p) { struct student *head = p; FILE* pf = fopen("text.txt","w"); if(pf == NULL) { printf("打开文件失败\n"); exit(1); } while(head != NULL) { fwrite(&head->man,sizeof(head->man),1,pf);//将链表的联系人信息写入文件中 head = head->next ; } fclose(pf); } //************从文件中读取************* void Load(struct student** p) { struct person q; FILE* pf = fopen("text.txt","r"); if(pf == NULL) { printf("文件无法打开\n"); return ; } while(1) { struct student *head = (struct student *)malloc(sizeof(struct student)); if(fread(&q,sizeof(struct person),1,pf) != 1) break; head->man = q; head->next = NULL; head->next = *p; *p = head; } fclose(pf); } int main() { int i = 0; struct student *p = NULL;//首指针 do { Menu(); printf("请选择:"); scanf("%d", &i); switch(i) { case 1: Insert(&p); break; case 2: Drop(&p); break; case 3: Amend(&p); break; case 4: show(p); break; case 5: Find(p); break; case 6: Allfree(&p); break; case 7: Sort(&p); break; case 8: Save(p); break; case 9: Load(&p); break; case 0://退出时,将链表内的信息存入文件中,并且释放动态开辟的空间 Save(p); Allfree(&p); printf("退出通信录\n"); break; default: printf("请重新输入\n"); break; } }while(i); free(p); p = NULL; system("pause"); return 0; }