2 通讯录管理
2.1系统
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
2.1.1 功能需求分析
通讯录管理系统的开发工具采用Visual C++6.0,主要功能是对联系人的信息进行添加、显示、查找、删除、更新、保存等功能。系统给用户提供了一个简单的人机界面,使用户可以根据提示输入操作项,调用对应函数完成系统提供的管理功能。
主要功能需求描述如下:
1. 系统主控平台:允许用户选择想要进行的操作,包括输入添加联系人信息、显示联系人信息、查找联系人信息、删除联系人信息、更新联系人信息、保存到文件和退出系统等。
2. 添加联系人信息:用户根据提示输入联系人的姓名、性别、电话、手机、传真、地址及邮编等。输入完一条联系人信息,提示用户是否继续输入下一条联系人信息或者继续其他操作。允许输入多条联系人的信息。输入完的联系人信息暂时保存在单链表中,等待下一步的操作。
3. 显示联系人信息:在选择了显示联系人信息后,将刚输入的联系人信息从单链表中调出来显示,如果没有数据,则提示无联系人信息。
4. 查找联系人信息:可以根据联系人姓名从单链表中对所有联系人的信息进行查询,如果没有查询到任何信息,系统给出提示信息。
5. 删除联系人信息:首先提示用户输入要删除的联系人的姓名,系统根据用户输入的信息在单链表中查到,如果找到,直接删除该联系人全部信息,如果没找到,系统给出提示信息。
6. 修改联系人信息:首先提示用户输入要进行修改操作的学号,如果单链表中有该学生的信息存在,则提示用户输入要修改的联系人的信息,并将修改结果重新存储在单链表中。如果没有找到要修改的联系人信息,系统将给出提示。
7. 文件保存:本模块的功能是将单链表中的信息存储到文本文件中。系统将提示用户输入文本文件名,确认后将单链表中存储的联系人的信息。
8. 退出,退出系统。
2.1.2功能模块设计
1. 添加联系人(add函数)
首先建立单链表,调用input_person()函数输入联系人信息,将用户输入的联系人信息存储到单链表中,提示用户是否继续输入,用户输入“Y”或“y”,则调用add()函数实现添加联系人的操作。用户输入“N”或“n”,则返回主菜单界面。
2. 显示联系人
将单链表中的联系人信息打印出来,单链表不为空时,循环调用print_person()函数打印每个联系人信息。
3. 查找联系人
首先提示用户输入要查找的联系人姓名,根据用户输入的姓名在单链表中利用strcmp()函数逐个查找。如果找到该联系人,调用print_person()函数显示查找到的联系人信息,如果没找到给出提示信息。
4. 删除联系人
首先提示用户输入要删除的联系人姓名,根据用户的输入在单链表中查找该联系人是否存在,如果存在,调用print_person()函数显示该联系人信息,提示用户是否确认删除该联系人,用户输入“Y”或“y”,则删除该联系人,否则提示用户是否继续删除的操作,用户输入“Y”或“y”,则在此调用delete()函数进行删除操作。
5. 更新联系人
首先提示用户输入要更新的联系人姓名,根据用户的输入在单链表中查找该联系人是否存在,如果存在,先调用print_person()函数显示该联系人信息,在调用input_person()函数输入新的数据。最后提示用户是否继续更新的操作,用户输入“Y”或“y”,则在此调用update()函数进行删除操作。
6. 保存到文件
首先提示用户输入要保存的文件名,文件将保存在程序目录下。系统将单链表中的联系人信息保存在刚才输入的文件中,并给出“保存成功”的提示信息。
7. 退出系统
将单链表中的数据全部释放掉,防止内存泄露,退出系统。
通讯录管理的功能模块图如图4-1所示。
SHAPE \* MERGEFORMAT
2.2 设计说明
2.2.1 预处理
#include
/*
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
输入输出函数库*/
#include
/*标准函数库*/
#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
2.2.2 数据类型定义
定义一个结构体类型_person,使用typedef语句定义一个新类型person,结构体中包括联系人姓名、性别、出生日期、电话、手机、传真、地址及邮编共8个成员。
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;
定义一个结构体类型_addr_book,使用typedef语句定义一个新类型addr_book,结构体中包括一个存储联系人基本信息的结构体变量per和指向下一个联系人的指针变量。
typedef struct _addr_book
{
person per;
/*联系人基本信息*/
struct _addr_book* next;
}addr_book;
定义一个头结点,将其初始化为空。
addr_book* first = NULL;/*addr_book结构体,链表的头结点,置空*/
2.2.3函数及变量声明
1. 主要处理函数声明
函数声明部分包括了主要函数的声明。主要有添加联系人函数、显示联系人信息函数、查找联系人函数、删除联系人函数、更新联系人函数、保存到文件和退出函数8个功能函数。
void add();
/*添加联系人函数*/
void show();
/*显示联系人函数*/
void search();
/*查找联系人函数*/
void delete();
/*删除联系人函数*/
void update();
/*更新联系人函数*/
void save();
/*保存到文件*/
void quit();
/*退出*/
2. 辅助函数声明
为了完成系统功能,特编写了一些辅助功能的小函数,包括打印主菜单函数、取链表中最后一个值的函数、打印联系人信息函数和输入联系人信息函数。下面是这部分函数的声明。
int print_menu();
/*打印主菜单界面*/
addr_book* get_last(addr_book* from);
/*取得链表最后一个值*/
void print_person(person* p);
/*显示一个联系人信息*/
void input_person(person* p);
/*提示输入一个联系人具体信息*/
3. 常量声明
以下是主菜单要显示的字符的声明。
char menu[] =
"+=====================================================+\n"
"| 通讯簿管理系统 |\n"
"+-----------------------------------------------------+\n"
"| 1 添加联系人 |\n"
"| 2 显示所有联系人 |\n"
"| 3 查找联系人 |\n"
"| 4 删除联系人 |\n"
"| 5 更新联系人 |\n"
"| 6 保存联系人 |\n"
"| 7 退出系统 |\n"
"+=====================================================+\n";
2.2.4主函数
主函数中,首先调用打印主菜单界面函数print_menu(),打印主菜单,等待用户输入1~7中的任一数值,根据用户的输入在switch语句中选择相应的操作,分别是用户输入1,调用添加联系人函数(add())添加联系人信息,输入2调用显示联系人函数(show())显示已输入的联系人信息,输入3调用查找联系人函数(search())按姓名查找联系人信息,输入4调用删除联系人函数(delete())删除联系人信息,输入5调用更新联系人函数(update())修改联系人信息,输入6调用保存函数(save())保存联系人信息,输入7调用退出函数(quit())退出系统。
程序清单:
int main()
{
int flg = 1;
while (flg)
{
switch(print_menu()) {
case 1:
add();
break;
case 2:
show();
break;
case 3:
search();
break;
case 4:
delete();
break;
case 5:
update();
break;
case 6:
save();
break;
case 7:
quit();
break;
}
}
}
2.2.5主要函数功能介绍
1. 添加新
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
函数名称:add。
函数功能:用户在主菜单中选择1的时候调用此函数,用来输入联系人的基本信息。
处理过程:
(1)首先创建一个结构体指针变量new_addr,并将其next指针置空,其余信息使用memset函数置0。
(2)判断单链表是否有数据,如果有,即first == NULL,则置new_addr为头结点;否则调用函数get_last找到单链表中的最后一个结点last,将new_addr连接到最后一个结点last的后面;
(3)调用函数input_person完成一个联系人信息的输入;
(4)提示用户是否继续输入联系人信息,如果用户输入“y”或“Y””,表示继续输入,则调用本函数;否则返回主函数。
程序清单:
void add()
{
char input = 'N';
addr_book* last = NULL;
addr_book* new_addr = (addr_book*)malloc(sizeof(addr_book));
/*将new_addr 中的前addr_book 个长度的初值设置为0*/
memset(new_addr, 0, sizeof(addr_book));
new_addr->next = NULL;
if (first == NULL)
{
first = new_addr;
}
else
{
last = get_last(first);
last->next = new_addr;
}
input_person(&(new_addr->per));
printf(">继续输入?(Y 继续, N 返回菜单)");
getchar();
input = getchar();
if (input == 'Y' || input == 'y')
{
add();
}
}
2. 显示联系人信息
函数名称:show。
函数功能:用户在主菜单中选择2的时候调用此函数,用来显示联系人的基本信息。
处理过程:
(1)首先定义一个指针变量p指向头结点first;
(2)在单链表未结束时((p != NULL)反复调用函数print_person逐个打印联系人信息;
(3)如果单链表中没有数据,系统给出提示。
(4)返回主函数。
程序清单:
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();
}
3. 查找联系人信息
函数名称:search。
函数功能:用户在主菜单中选择3的时候调用此函数,根据联系人姓名查找相关信息。
处理过程:
(1)首先定义一个指针变量p指向头结点first;
(2)输入要查找的联系人姓名,根据姓名在单链表中逐个查找联系人信息;如果找到,调用函数print_person显示该联系人信息,否则给出提示信息;
(3)提示用户是否查找,如果用户输入“y”或“Y”,表示继续查找,则调用本函数;否则返回主函数。
程序清单:
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)
{
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();
}
}
4. 删除联系人信息
函数名称:delete。
函数功能:用户在主菜单中选择4的时候调用此函数,根据联系人姓名删除该联系人相关信息。
处理过程:
(1)首先定义一个指针变量p指向头结点first,定义一个p1,将其置空;
(2)输入要删除的联系人姓名,根据姓名在单链表中逐个查找联系人信息;如果没找到,系统给出提示信息,否则进行删除操作:
1)如果要删除的结点p是头结点,则将p->next赋值给first,即first = p->next,直接删除;
2)如果要删除的接点不是头结点,先设置p1指向头结点,然后在循环体中判断p1的后续结点是不是p,借助p1删除结点p,即p1->next = p->next;
3)释放结点p。
(3)提示用户是否删除操作,如果用户输入“y”或“Y”,表示继续删除,调用本函数;否则返回主函数。
程序清单:
void delete()
{
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("确定要删除姓名为[%d]的联系人么?(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')
{
delete();
}
}
5. 更新联系人信息
函数名称:update。
函数功能:用户在主菜单中选择5的时候调用此函数,输入联系人姓名,更新其相关信息。
处理过程:
(1)首先定义一个指针变量p,指向头结点first;
(2)输入要更新的联系人姓名,根据姓名在单链表中逐个查找联系人信息;如果找到,调用函数print_person显示该联系人信息,对于找到的联系人调用函数input_person更新其基本信息,如果没找到给出提示信息;
(3)提示用户是否更新的操作,如果用户输入“y”或“Y”,表示继续更新,则调用本函数;否则返回主函数。
程序清单:
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();
}
}
6. 保存联系人信息
函数名称:save。
函数功能:用户在主菜单中选择6的时候调用此函数,将单链表中的联系人信息保存到文件中。
处理过程:
(1)首先定义一个指针变量p指向头结点first;
(2)输入文件名,在循环体中利用函数fprintf逐个将单链表中的联系人的信息保存到文件中;
(3)否则返回主函数。
程序清单:
void save()
{
FILE *fp;
char file[100];
addr_book* p = first;
printf("请输入文件名:");
scanf("%s",file);
fp=fopen(file,"w");
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);/*如果pdel的next指针为空,表示没有下一条数据,直接删除该结点*/
exit(0);
}
2.2.6 辅助函数功能介绍
1. 显示主菜单界面
函数名称:print_menu。
函数功能:显示主菜单界面。
处理过程:等待用户输入1~7中的任一数据,如果用户输入的1~7之外的数据,则给出出错的提示信息,提示用户再次输入,直到输入正确为止,并将用户输入的值返回。
程序清单:
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;
}
2. 显示主菜单界面
函数名称:input_person。
函数功能:提示用户输入相关联系人信息。
程序清单:
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
3. 显示一个联系人的信息
函数名称:print_person。
函数功能:显示联系人信息。
程序清单:
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");
}
4. 取得链表最后一个值
函数名称:get_last。
函数功能:参数传过来一个结点from,如果from不为空,顺序找到该链表的最后一个结点,如果为空,from就是最后一个结点。
程序清单:
addr_book* get_last(addr_book* from)
{
addr_book* p = from;
while (p->next != NULL)
{
p = p->next;
}
return p;
}
2.3 程序运行截图
2.4源程序代码
#include
#include
#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;
char menu[] =
"+=====================================================+\n"
"| 通讯簿管理系统 |\n"
"+-----------------------------------------------------+\n"
"| 1 添加联系人 |\n"
"| 2 显示所有联系人 |\n"
"| 3 查找联系人 |\n"
"| 4 删除联系人 |\n"
"| 5 更新联系人 |\n"
"| 6 保存 |\n"
"| 7 退出系统 |\n"
"+=====================================================+\n";
void add();
void show();
void search();
void delete();
void update();
void save();
void quit();
int print_menu();
addr_book* get_last(addr_book* from);
void print_person(person* p);
void input_person(person* p);
int main()
{
int flg = 1;
while (flg)
{
switch(print_menu()) {
case 1:
add();
break;
case 2:
show();
break;
case 3:
search();
break;
case 4:
delete();
break;
case 5:
update();
break;
case 6:
save();
break;
case 7:
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->next = NULL;
if (first == NULL)
{
first = new_addr;
}
else
{
last = get_last(first);
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)
{
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 delete()
{
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/*不是链表中第一个结点时,找到p的前序结点p1*/
{
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')
{
delete();
}
}
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,"w");
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);
}
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->nam