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