/*****************test.c****************/
#include <stdio.h>
#include <stdlib.h>
#include "addr.h"
#include <stdio.h>
#include <stdlib.h>
#include "addr.h"
int main()
{
int flag=1;
while(flag)
{
switch(choose_menu())
{
case 1:add_person();break;
case 2:show_person_info();break;
case 3:search_person();break;
case 4:delete_person();break;
case 5:updata_person();break;
case 6:save_info();break;
case 7:quit();break;
default:break;
}
}
}
{
int flag=1;
while(flag)
{
switch(choose_menu())
{
case 1:add_person();break;
case 2:show_person_info();break;
case 3:search_person();break;
case 4:delete_person();break;
case 5:updata_person();break;
case 6:save_info();break;
case 7:quit();break;
default:break;
}
}
}
/*****************addr.c****************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "addr.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "addr.h"
/*****************常量声明****************/
char menu[]=
"+======================================================+/n"
"| 通讯薄管理系统 |/n"
"+------------------------------------------------------+/n"
"| 1 添加联系人 |/n"
"| 2 显示所有联系人 |/n"
"| 3 查找联系人 |/n"
"| 4 删除联系人 |/n"
"| 5 更新联系人 |/n"
"| 6 保存到文件 |/n"
"| 7 退出 |/n"
"+======================================================+/n";
char menu[]=
"+======================================================+/n"
"| 通讯薄管理系统 |/n"
"+------------------------------------------------------+/n"
"| 1 添加联系人 |/n"
"| 2 显示所有联系人 |/n"
"| 3 查找联系人 |/n"
"| 4 删除联系人 |/n"
"| 5 更新联系人 |/n"
"| 6 保存到文件 |/n"
"| 7 退出 |/n"
"+======================================================+/n";
/*******************全局变量**********************/
person_list first=NULL;
person_list first=NULL;
/*****************主要处理函数声明*****************/
void add_person(); /*添加联系人信息*/
void show_person_info(); /*显示联系人信息*/
void search_person(); /*查找联系人信息*/
void delete_person(); /*删除联系人信息*/
void updata_person(); /*更新联系人信息*/
void save_info(); /*保存到文件*/
void quit(); /*退出*/
void add_person(); /*添加联系人信息*/
void show_person_info(); /*显示联系人信息*/
void search_person(); /*查找联系人信息*/
void delete_person(); /*删除联系人信息*/
void updata_person(); /*更新联系人信息*/
void save_info(); /*保存到文件*/
void quit(); /*退出*/
/*****************辅助函数声明*****************/
int choose_menu(); /*打印主菜单界面,并选择*/
person_list get_last(person_list p); /*取得链表的最后一个值*/
void print_person(info_list p); /*显示一个联系人的信息*/
void input_person(info_list p); /*输入一个联系人的具体信息*/
person_list get_last(person_list p); /*取得链表的最后一个值*/
void print_person(info_list p); /*显示一个联系人的信息*/
void input_person(info_list p); /*输入一个联系人的具体信息*/
/****************************************************************
*函数功能:添加联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void add_person()
{
char input = 'N';
person_list last = NULL;
person_list new_person = (person_list)malloc(sizeof(person));
memset(new_person, 0, sizeof(person)); /*将new_person中的前person个长度的初始值设置为0*/
new_person->next=NULL;
if(first==NULL)
{
first=new_person;
}
else
{
last=get_last(first);
last->next=new_person;
}
input_person(&(new_person->per));
printf(">继续输入?(Y 继续, N 返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
add_person();
}
}
*函数功能:添加联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void add_person()
{
char input = 'N';
person_list last = NULL;
person_list new_person = (person_list)malloc(sizeof(person));
memset(new_person, 0, sizeof(person)); /*将new_person中的前person个长度的初始值设置为0*/
new_person->next=NULL;
if(first==NULL)
{
first=new_person;
}
else
{
last=get_last(first);
last->next=new_person;
}
input_person(&(new_person->per));
printf(">继续输入?(Y 继续, N 返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
add_person();
}
}
/****************************************************************
*函数功能:显示联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void show_person_info()
{
int i=0;
person_list 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 show_person_info()
{
int i=0;
person_list 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_person()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
person_list 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);
}
printf("继续查找吗?(Y 继续查找, N 返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
search_person();
}
}
*函数功能:查找联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void search_person()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
person_list 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);
}
printf("继续查找吗?(Y 继续查找, N 返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
search_person();
}
}
/****************************************************************
*函数功能:删除联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void delete_person()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
person_list p=first;
person_list 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_person();
}
}
*函数功能:删除联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void delete_person()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
person_list p=first;
person_list 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_person();
}
}
/****************************************************************
*函数功能:更新联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void updata_person()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
person_list p=first;
person_list 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
{
input_person(&(p->per));
}
printf("继续更新其它联系人吗?(Y 继续更新, N 返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
updata_person();
}
}
*函数功能:更新联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void updata_person()
{
int count=0;
char input='N';
char name[MAX_NAME]={0};
person_list p=first;
person_list 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
{
input_person(&(p->per));
}
printf("继续更新其它联系人吗?(Y 继续更新, N 返回菜单)");
getchar();
input=getchar();
if(input=='Y'||input=='y')
{
updata_person();
}
}
/****************************************************************
*函数功能:保存联系人信息
*入口参数:无
*出口参数:无
****************************************************************/
void save_info()
{
FILE *fp;
char file[100];
person_list 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 save_info()
{
FILE *fp;
char file[100];
person_list 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()
{
person_list pdel=first;
person_list 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);
}
*函数功能:退出系统函数
*入口参数:无
*出口参数:无
****************************************************************/
void quit()
{
person_list pdel=first;
person_list 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);
}
/****************************************************************
*函数功能:显示方菜单界面,并提供选择
*入口参数:无
*出口参数:无
****************************************************************/
int choose_menu()
{
int;
system("cls");
printf(menu);
printf(">请选择[1~7]:");
scanf("%d",&selected);
if(selected<1||selected>7)
{
printf("错误的选择!(请输入1~7).按任意键继续...");
getchar();
getchar();
}
return selected;
}
*函数功能:显示方菜单界面,并提供选择
*入口参数:无
*出口参数:无
****************************************************************/
int choose_menu()
{
int;
system("cls");
printf(menu);
printf(">请选择[1~7]:");
scanf("%d",&selected);
if(selected<1||selected>7)
{
printf("错误的选择!(请输入1~7).按任意键继续...");
getchar();
getchar();
}
return selected;
}
/****************************************************************
*函数功能:输入联系人相关信息
*入口参数:指向info的指针p
*出口参数:无
****************************************************************/
void input_person(info_list p)
{
system("cls");
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);
}
*函数功能:输入联系人相关信息
*入口参数:指向info的指针p
*出口参数:无
****************************************************************/
void input_person(info_list p)
{
system("cls");
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);
}
/****************************************************************
*函数功能:显示一个联系人的相关信息
*入口参数:指向info的指针p
*出口参数:无
****************************************************************/
void print_person(info_list p)
{
system("cls");
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");
}
*函数功能:显示一个联系人的相关信息
*入口参数:指向info的指针p
*出口参数:无
****************************************************************/
void print_person(info_list p)
{
system("cls");
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");
}
/****************************************************************
*函数功能:取得链表的最后一个值
*入口参数:指向info的指针p
*出口参数:指向最后一个节点的指针
****************************************************************/
person_list get_last(person_list from)
{
person_list p=from;
while(p->next!=NULL)
{
p=p->next;
}
return p;
}
*函数功能:取得链表的最后一个值
*入口参数:指向info的指针p
*出口参数:指向最后一个节点的指针
****************************************************************/
person_list get_last(person_list from)
{
person_list p=from;
while(p->next!=NULL)
{
p=p->next;
}
return p;
}
/*****************addr.h****************/
#ifndef _addr_h_
#define _addr_h_
#ifndef _addr_h_
#define _addr_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
#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 _info
{
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];/*邮编*/
}info,*info_list;
typedef struct _info
{
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];/*邮编*/
}info,*info_list;
typedef struct _person
{
info per;
struct _person *next;
}person,*person_list;
{
info per;
struct _person *next;
}person,*person_list;
/*****************主要处理函数声明*****************/
extern void add_person(); /*添加联系人信息*/
extern void show_person_info(); /*显示联系人信息*/
extern void search_person(); /*查找联系人信息*/
extern void delete_person(); /*删除联系人信息*/
extern void updata_person(); /*更新联系人信息*/
extern void save_info(); /*保存到文件*/
extern void quit(); /*退出*/
extern void add_person(); /*添加联系人信息*/
extern void show_person_info(); /*显示联系人信息*/
extern void search_person(); /*查找联系人信息*/
extern void delete_person(); /*删除联系人信息*/
extern void updata_person(); /*更新联系人信息*/
extern void save_info(); /*保存到文件*/
extern void quit(); /*退出*/
/*****************辅助函数声明*****************/
extern int choose_menu(); /*打印主菜单界面,并选择*/
extern person_list get_last(person_list p); /*取得链表的最后一个值*/
extern void print_person(info_list p); /*显示一个联系人的信息*/
extern void input_person(info_list p); /*输入一个联系人的具体信息*/
extern person_list get_last(person_list p); /*取得链表的最后一个值*/
extern void print_person(info_list p); /*显示一个联系人的信息*/
extern void input_person(info_list p); /*输入一个联系人的具体信息*/
#endif