#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_NAME 11
#define MAX_SEX 3
#define MAX_BIRTHDAY 9
#define MAX_TEL 21
#define MAX_MOBILE 21
#define MAX_FAX 21
#define MAX_ADDRESS 101
#define MAX_POSTAL_CODE 7
typedef struct _person //定义一个存放联系人信息的结构体
{
char name[MAX_NAME];
char sex[MAX_SEX];
char birthday[MAX_BIRTHDAY];
char tel[MAX_TEL];
char mobile[MAX_MOBILE];
char fax[MAX_FAX];
char address[MAX_ADDRESS];
char postal_code[MAX_POSTAL_CODE];
}person;
typedef struct _addr_book //定义一个单向链表
{
person per;
struct _addr_book *next;
}addr_book;
addr_book *first=NULL; //定义一个头节点,并置空。
//函数申明
void add();
void show();
void search();
void delete1();
void update();
void save();
void lookforward();
void quit();
//辅助函数声明
int print_menu(); //打印主菜单界面
addr_book* get_last(addr_book* from); //取得链表的一个值
void print_person(person *p); //显示一个联系人的信息
void input_person(person *p); //提示输入一个联系人的具体信息
//常量声明
char menu[]="+=============================================\n"
"|通讯簿管理系统 \n"
"+---------------------------------------------\n"
"|1添加联系人 \n"
"|2显示联系人 \n"
"|3查找联系人 \n"
"|4删除联系人 \n"
"|5更新联系人 \n"
"|6保存联系人信息 \n"
"|7查看以前的通讯录文件 \n"
"|8退出系统 \n"
"+=============================================\n";
//主函数
void main()
{
int flg=1;
while(flg)
{
switch(print_menu())
{
case 1:
add();
break;
case 2:
show();
break;
case 3:
search();
break;
case 4:
delete1();
break;
case 5:
update();
break;
case 6:
save();
break;
case 7:
lookforward();
break;
case 8:
quit();
break;
}
}
}
//主函数功能介绍
//添加新纪录
void add()
{
char input='N';
addr_book *last=NULL;
addr_book *new_addr=(addr_book*)malloc(sizeof(addr_book));
memset(new_addr,0,sizeof(addr_book)); //将new_addr中的前addr_book个长度的初值设置为0
new_addr->next=NULL;
if(first==NULL)
{
first=new_addr;
}
else
{
last=get_last(first); //将链表的最后的一个节点赋值给last变量
last->next=new_addr; //
}
input_person(&(new_addr->per));
printf(">继续输入?(Y 继续,N返回主菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
add();
}
}
//显示联系人的信息
void show()
{
int i=0;
addr_book *p=first;
while(p!=NULL)
{
i++;
printf("*****第%d个联系人******************************\n",i);
print_person(&(p->per)); //打印一个联系人的信息
p=p->next;
}
if(i==0)
{
printf("没有联系人!");
}
printf("按任意键返回菜单。。。");
getchar();
getchar(); //
}
//查找联系人信息
void search()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
addr_book *p=first;
printf(">请输入要查找的联系人的联系姓名(最大%d个字符):",MAX_NAME-1);
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(p->per.name,name)==0) //strcmp这个函数是有头文件为<string.h>来决定的
{
print_person(&(p->per));
count++;
}
p=p->next;
}
if(count==0)
{
printf("没有找到姓名为%s的人。",name);
}
printf("继续查找吗?(y继续查找,n返回菜单)");
getchar();
input=getchar();
if(input=='y'||input=='Y')
{
search();
}
}
//删除联系人的信息
void delete1()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
addr_book *p=first;
addr_book *p1=NULL;
printf(">请输入要删除的联系人的姓名(最大%d个字符):",MAX_NAME-1);
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(p->per.name,name)==0)
{
print_person(&(p->per));
count++;
break;
}
p=p->next;
}
if(count==0)
{
printf("没有姓名为%s的人。",name);
}
else
{
printf("确定要删除的姓名为[%s]的联系人吗?(y确认,n取消)",name);
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
if(p==first)
{
first=p->next;
}
else
{
p1=first;
while(p1!=NULL)
{
if(p1->next==p)
{
p1->next=p->next;
break;
}
p1=p1->next;
}
}
free(p);
}
}
printf("继续删除其他联系人吗?(Y继续,N返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
delete1();
}
}
//更新联系人信息
void update()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
addr_book *p=first;
printf(">请输入要更新的联系人的姓名(最大%d个字符):",MAX_NAME-1);
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(p->per.name,name)==0)
{
print_person(&(p->per));
count++;
break;
}
p=p->next;
}
if(count==0)
{
printf("没有找到的姓名为%s的人。",name);
}
else
{
input_person(&(p->per));
}
printf("继续更新其他的联系人吗?(Y继续更新,N返回主菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
update();
}
}
//保存联系人的信息
void save()
{
FILE *fp;
char file[100];
addr_book *p=first;
printf("请输入文件名:");
scanf("%s",file);
fp=fopen(file,"a+");
while(p!=NULL)
{
fprintf(fp,"%s,%s,%s,%s,%s,%s,%s,%s\n",p->per.name,p->per.sex,p->per.birthday,p->per.tel,
p->per.mobile,p->per.fax,p->per.address,p->per.postal_code);
p=p->next;
}
fclose(fp);
printf("保存成功!\n按任意键返回菜单。。\n");
getchar();
getchar();
}
//查看以前保留的通讯录
void lookforward()
{
FILE *fp;
char file[100];
addr_book *p=first;
printf("请输入文件名:");
scanf("%s",file);
fp=fopen("F:\\每天学习\\c语言学习\\通讯录系统\\林辉的通讯录.txt","r+");
/* while(p!=NULL)
{
fprintf(fp,"%s,%s,%s,%s,%s,%s,%s,%s\n",p->per.name,p->per.sex,p->per.birthday,p->per.tel,
p->per.mobile,p->per.fax,p->per.address,p->per.postal_code);
p=p->next;
}*/
fclose(fp);
printf("保存成功!\n按任意键返回菜单。。\n");
getchar();
getchar();
}
//退出系统函数
void quit()
{
addr_book *pdel=first;
addr_book *p=NULL;
if(pdel==NULL)
{
exit(0);
}
//如果pdel的next指针不为空,表示有下一个数据
//先将p指向pdel,释放掉pdel,再将p重复给pdel
while(pdel->next!=NULL)
{
p=pdel->next;
free(pdel);
pdel=p;
}
free(pdel);
exit(0);
}
//辅助函数功能功能介绍
//显示主菜单界面
int print_menu()
{
int selected=0;
system("cls");
printf(menu);
printf(">请选择【1~7】:");
scanf("%d",&selected);
if(selected<1||selected>7)
{
printf("错误的选择!(请输入1~7).按任意键继续....");
getchar();
getchar();
}
return selected;
}
//显示主菜单界面
void input_person(person *p)
{
printf(">请输入联系人的信息:\n");
printf("请输入姓名(最大长度%d个字符):",MAX_NAME-1);
scanf("%s",p->name);
printf("请输入性别(最大长度%d个字符):",MAX_SEX-1);
scanf("%s",p->sex);
printf("请输入出生日期(最大长度%d个字符):",MAX_BIRTHDAY-1);
scanf("%s",p->birthday);
printf("请输入电话(最大长度%d个字符):",MAX_TEL-1);
scanf("%s",p->tel);
printf("请输入手机(最大长度%d个字符):",MAX_MOBILE-1);
scanf("%s",p->mobile);
printf("请输入传真(最大长度%d个字符):",MAX_FAX-1);
scanf("%s",p->fax);
printf("请输入地址(最大长度%d个字符):",MAX_ADDRESS-1);
scanf("%s",p->address);
printf("请输入邮编(最大长度%d个字符):",MAX_POSTAL_CODE-1);
scanf("%s",p->postal_code);
}
//显示一个联系人的信息
void print_person(person *p)
{
printf("姓名:%s\t 性别:%s\t 生日:%s\n",p->name,p->sex,p->birthday);
printf("电话:%s\n",p->tel);
printf("手机:%s\n",p->mobile);
printf("传真:%s\n",p->fax);
printf("地址:%s\n",p->address);
printf("邮编:%s\n",p->postal_code);
printf("\n");
}
//取得链表最后一个值