链表+文件版本通讯录(源代码)

xiaoxiao2021-02-28  124

0、头文件:

#ifndef _HEAD_H_ #define _HEAD_H_ #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct person { char name[20]; char sex[20]; char tel[11]; char QQ[20]; char address[20]; char addition[20]; int data; struct person *next; }PER,*Linklist; int show(); PER *create_node(); int insert_tail(Linklist head); void display(Linklist head); void search(Linklist head); int delete(Linklist head); int update(Linklist head); void readfromfile(Linklist head); void writetofile(Linklist head); #endif

1、菜单部分:

#include <stdio.h> #include <stdlib.h> #include <string.h> const int show() { int choice; int ret = 0; while(1) { printf(" ====================================== \n"); printf(" | | \n"); printf(" | 多功能电子通讯录 | \n"); printf(" | | \n"); printf(" | 作者:566 | \n"); printf(" |------------------| \n"); printf(" | 1、添加好友信息 | 2、删除好友信息 | \n"); printf(" |------------------| \n"); printf(" | 3、查看好友信息 | 4、搜索好友信息 | \n"); printf(" |____________________________________| \n"); printf(" | 5、修改好友信息 | 6、保存并退出 | \n"); printf(" |____________________________________| \n"); printf(" please input your choice: "); ret = scanf("%d",&choice); while((ret != 1)||(!(choice == 1||choice == 2||choice ==3||choice ==4||choice == 5||choice ==6))) { while(getchar() != '\n'); printf("\33[1;35m error input!please input correct choice 1/2/3/4/5/6:"); ret = scanf("%d",&choice); } if(choice == 1||choice ==2||choice == 3||choice == 4||choice == 5||choice == 6) { return choice; } } return 0; } 2、添加好友

#include "head.h" int insert_tail(Linklist head) { PER *p = head; char ch; while(p->next != NULL) //p指向最后一个结点 { p = p->next; } PER *new = (PER *)malloc(sizeof(PER)); printf("姓名:\n"); scanf("%s",new->name); printf("性别(female/male):\n"); scanf("%s",new->sex); while(!(strcmp(new->sex,"male")== 0||strcmp(new->sex,"female")==0)) { while(getchar()!= '\n'); printf("输入错误,请重新输入(female/male):\n"); scanf("%s",new->sex); } printf("电话:\n"); scanf("%s",new->tel); printf("QQ:\n"); scanf("%s",new->QQ); printf("地址:\n"); scanf("%s",new->address); printf("备注:\n"); scanf("%s",new->addition); p->next = new; new->next = NULL; printf("\n添加成功!\n"); printf("是否继续添加(y/n):\n"); scanf(" %c",&ch); while(ch != 'y'&&ch != 'Y'&&ch != 'n'&&ch != 'N') { while(getchar() != '\n'); printf("输入错误,请重新输入(y/n):\n"); scanf(" %c",&ch); } if(ch == 'n'||ch == 'N') { return 0; } else { system("reset"); insert_tail(head); //如果继续,再次调用插入函数 } }3、删除好友

#include "head.h" int delete(Linklist head) { char name[20]; //输入你要删除的联系人的姓名 PER *p = head; //用于删除指定的联系人 PER *pre = NULL; //存放p结点的位置 int flag = 0; char ch; //回答是否继续 int count = 0; int num = 0; //输入要删除联系人的编号 int flag1 = 0; //判断是否输入成功 int ret = 0; //判断数字输入是否有错 if(p->next == NULL) { printf("通讯录为空,无法查找!\n"); return 0; } printf("请输入你要删除的人的姓名:\n"); scanf("%s",name); while(p->next != NULL) //为查找的联系人进行编号 { p = p->next; if(strcmp(p->name,name) == 0) { count++; p->data = count; printf("编号:%d\n",p->data); printf("姓名:%s\n",p->name); printf("性别:%s\n",p->sex); printf("电话: %s\n",p->tel); printf("QQ: %s\n",p->QQ); printf("地址:%s\n",p->address); printf("备注:%s\n",p->addition); printf("\n===============================================================\n"); flag = 1; } } p = head; if(count >= 1) //删除指定联系人 { printf("已经查询到你要删除的联系人信息.确认删除请输入你要删除的编号:\n"); ret = scanf("%d",&num); while(ret != 1) { while(getchar() != '\n'); printf("输入错误,请重新输入:\n"); ret = scanf("%d",&num); } while(p->next != NULL) { pre = p; p = p->next; if((strcmp(p->name,name) == 0)&&(p->data == num)) { if(p->next == NULL) { pre->next = NULL; free(p); p = NULL; } else { pre->next = p->next; free(p); p = NULL; } flag1 = 1; printf("删除成功!\n"); break; } } if(flag1 == 0) { printf("删除失败!\n"); } } if(flag == 0) { printf("您删除的人不存在!\n"); } printf("\n是否继续删除(y/n):\n"); scanf(" %c",&ch); while(ch != 'y'&&ch != 'Y'&&ch != 'n'&&ch != 'N') { while(getchar() != '\n'); printf("输入错误,请重新输入:\n"); scanf(" %c",&ch); } if(ch == 'y'||ch == 'Y') { system("reset"); delete(head); } else { return 0; } }3、查看好友

#include "head.h" void display(Linklist head) { PER *p = head; if(p->next == NULL) { printf("\n当前没有存储的联系人,请添加联系人:\n"); } while(p->next != NULL) { p = p->next; printf("姓名:%s\n",p->name); printf("性别:%s\n",p->sex); printf("电话:%s\n",p->tel); printf("QQ: %s\n",p->QQ); printf("地址:%s\n",p->address); printf("备注:%s\n",p->addition); printf("\n==================================================\n"); } } 4、搜索好友

#include "head.h" void search(Linklist head) { char name[20] = {0}; Linklist p = head; int flag = 0; printf("please input name you want to search:\n"); scanf("%s",name); if(p->next == NULL) { printf("通讯录为空,你搜索的人不存在,请返回菜单插入:\n"); } while(p->next != NULL) { p = p->next; if(strcmp(p->name,name) == 0) { printf("姓名:%s\n",p->name); printf("性别:%s\n",p->sex); printf("电话:%s\n",p->tel); printf("QQ: %s\n",p->QQ); printf("住址:%s\n",p->address); printf("备注: %s\n",p->addition); printf("\n==============================================\n"); flag = 1; } } if(flag == 1) { printf("搜索成功!\n"); } else { printf("你搜索的人不存在!\n"); } } 5、修改好友

#include "head.h" int update(Linklist head) { char name[20]; //输入你要修改的联系人的姓名 char sex[20]; char tel[20]; char QQ[20]; char address[20]; char addition[20]; PER *p = head; //用于查找指定的联系人 PER *pre = NULL; //存放p结点的位置 int flag = 0; char ch; //回答是否继续 int count = 0; int num = 0; //输入要删除联系人的编号 int ret = 0; //判断数字输入是否有误 int flag1 = 0; //判断更新是否成功 if(p->next == NULL) { printf("通讯录为空,无法查找!\n"); } printf("请输入你要删除的人的姓名:\n"); scanf("%s",name); while(p->next != NULL) //为查找的联系人进行编号 { p = p->next; if(strcmp(p->name,name) == 0) { count++; p->data = count; printf("编号:%d\n",p->data); printf("姓名:%s\n",p->name); printf("性别:%s\n",p->sex); printf("电话: %s\n",p->tel); printf("QQ: %s\n",p->QQ); printf("地址:%s\n",p->address); printf("备注:%s\n",p->addition); printf("\n===============================================================\n"); flag = 1; } } p = head; if(count >= 1) //更新指定联系人 { printf("已经查询到你要修改的联系人信息.确认修改请输入你要修改的联系人编号:\n"); ret = scanf("%d",&num); while(ret != 1) { while(getchar() != '\n'); printf("输入有误,请重新输入:\n"); ret = scanf("%d",&num); } while(p->next != NULL) { pre = p; p = p->next; if((strcmp(p->name,name) == 0)&&(p->data == num)) { printf("请更新姓名:\n"); scanf("%s",name); printf("请更新性别(female/male):\n"); scanf("%s",sex); while(!(strcmp(sex,"male") == 0||strcmp(sex,"female") == 0)) { while(getchar() != '\n'); printf("输入有误,请重新输入:\n"); scanf("%s",sex); } printf("请更新电话:\n"); scanf("%s",tel); printf("请更新QQ:\n"); scanf("%s",QQ); printf("请更新地址:\n"); scanf("%s",address); printf("请更新备注:\n"); scanf("%s",addition); strcpy(p->name,name); strcpy(p->sex,sex); strcpy(p->tel,tel); strcpy(p->QQ,QQ); strcpy(p->address,address); strcpy(p->addition,addition); printf("更新成功!\n"); flag1 = 1; } } if(flag1 == 0) { printf("输入编号有误,无法进行修改!\n"); } } if(flag == 0) { printf("您修改的人不存在!\n"); } printf("\n是否继续修改(y/n):\n"); scanf(" %c",&ch); while(ch != 'y'&&ch != 'Y'&&ch != 'n'&&ch != 'N') { while(getchar() != '\n'); printf("输入错误,请重新输入:\n"); scanf(" %c",&ch); } if(ch == 'y'||ch == 'Y') { system("reset"); update(head); } else { return 0; } } 6、保存文件

#include "head.h" FILE *fp; void readfromfile(Linklist head) { Linklist p = head; while(p->next != NULL) { p = p->next; } fp = fopen("txl.txt","r"); if(fp == NULL) { perror("error!"); exit(-1); } while(!feof(fp)) { Linklist new = (Linklist)malloc(sizeof(PER)); fscanf(fp, "%s\n", new->name); fscanf(fp, "%s\n", new->sex); fscanf(fp, "%s\n", new->tel); fscanf(fp, "%s\n", new->QQ); fscanf(fp, "%s\n", new->address); fscanf(fp, "%s\n", new->addition); p->next = new; new->next = NULL; p = new; } } void writetofile(Linklist head) { Linklist p = head; int flag = 0; if((fp = fopen("txl.txt","w+")) == NULL) { printf("打开文件失败!无法进行写入!\n"); exit(0); } while(p->next != NULL) { p = p->next; fprintf(fp,"%s\n",p->name); fprintf(fp,"%s\n",p->sex); fprintf(fp,"%s\n",p->tel); fprintf(fp,"%s\n",p->QQ); fprintf(fp,"%s\n",p->address); fprintf(fp,"%s\n",p->addition); fprintf(fp,"\n"); flag = 1; } if(flag == 1) { printf("正在保存,请稍后...\n"); sleep(2); printf("\n保存成功\n"); } if(flag == 0) { printf("通讯录新数据,无法进行保存!\n"); } fclose(fp); } 7、主函数

#include "head.h" int main() { int choice = 0; //输入你要选择的 char relay; //选择是否回到主菜单 PER *head = create_node(); //创建一个链表 readfromfile(head); while(1) { system("reset"); choice = show(); system("reset"); switch(choice) { case 1: //添加好友 { insert_tail(head); break; } case 2: //删除好友 { delete(head); break; } case 3: //查看好友 { display(head); break; } case 4: //搜索好友 { search(head); break; } case 5: //修改好友 { update(head); break; } case 6: //保存文件 { writetofile(head); exit(0); break; } } printf("\n\n按回车键返回主菜单><....."); getchar(); getchar(); } }

转载请注明原文地址: https://www.6miu.com/read-21564.html

最新回复(0)