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

来源:互联网 发布:淘宝店steam游戏 编辑:程序博客网 时间:2024/05/21 00:54

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();}}