学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。
typedef struct personInfo SLDataType;
contact.h
#define NAME_MAX 20
#define GENDER_MAX 20
#define GTEL_MAX 20
#define ADDR_MAX 100
#include"SeqList.h"
//定义联系人数据结构
//姓名 性别 年龄 电话 地址
typedef struct PersonInfo
{
char[NAME_MAX];
gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}peoInfo;
//通讯录的初始化
typedef struct SeqList Contact;//改通讯录的名字,没有包含顺序表的头文件,所以需要写出完整的名字
void ContactInit(Contact*con);
//通讯录的销毁
void ContactDestory(Contact*con);
//往通讯录里添加数据
void ContactAdd(Contact*con);
//通讯录的修改
void ContactModify(Contact*con);
//通讯录的查找
void ContactFind(Contact*con);
//通讯录的展示
void ContactShow(Contact*con);
typedef int SLDataType;
//通讯录增加删除数据
SeqList.h
#include"Contact.h"//把头文件加载进来
//typedef int SLDataType
typedef peoInfo SLDataType
{
contact.c
#include"Contact.h"
//通讯录的初始化
void ContactInit(Contact* con)
{
//实际上要进行的是顺序表的初始化,顺序表的初始化实际上已经实现好了
SLInit(con);
}
void ContactDestroy(Contact* con)
{
SLDestroy(con);
}
//通讯录添加数据
void ContactAdd(contact* con)
{
peoInfo info;
//获取用户输入的内容:姓名,性别,年龄,电话,地址
printf("请输入要添加的联系人姓名:\n”);
scanf("%s",info.name);
printf("请输入要添加的联系人性别:\n”);
scanf("%s",info.gender);
printf("请输入要添加的联系人年龄:\n”);
scanf("%s",&info.age);
printf("请输入要添加的联系人电话:\n”);
scanf("%s",info.tel);
printf("请输入要添加的联系人住址:\n”);
scanf("%s",info.addr);
//往通讯录中添加数据
SLPushBack(con,info);//尾插,顺序表中已有方法的复用
}
//通讯录删除联系人
int FindByName(Contact*con,char name[])
{
for(int i=0;i<con->size;i++)
{
if(0==strcmo(con->arr[i].name,name))
{
//找到了
return i;
}
}
//没有找到
return -1;
}
void ContactDel(Contact* con)
{
//要删除的文件必须存在,才能执行删除操作
//查找
int find=FindByName(con,name);
if(find<0)
{
printf("要删除的联系人数据不存在!\n);
return;
}
//要删除的联系人存在-->知道了要删除的联系人数据对应的下标
SLErase(con,find);
printf("删除成功!\n");
}
//展示通讯录数据
void ContactShow(Contact* con)
{
//表头:姓名 性别 年龄 电话 地址
printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","地址");
for(int i=0;i<con->size;i++)
{
printf("%s %s %d %s %s\n",
con->arr[i].nme,
con->arr[i].gender,
con->arr[i].age,
con->arr[i].tel,
con->arr[i].addr
);
}
}
//通讯录的修改
void ContactModify(Contact*con)
{
//要修改的联系人数据存在
char name[NAME_MAX];
printf("请输入要修改的用户姓名:\n");
scanf("%s",nmae);
int find=FindByName(con,name);
if(find<0)
{
printf("要修改的联系人数据不存在!\n");
return;
}
//直接修改
printf("请输入新的姓名:\n");
scanf("%s",con->arr[find].name);
printf("请输入新的性别:\n");
scanf("%s",con->arr[find].gender);
printf("请输入新的电话:\n");
scanf("%s",con->arr[find].tel);
printf("请输入新的地址:\n");
scanf("%s",con->arr[find].addr);
printf("修改成功!\n)";
}
//通讯录查找
void ContactFind(Contact* con)
{
//姓名 性别 年龄 电话 地址
//11 11 11 11 11
char name[NAME_Max];
printf("%s",name);
int find=FindByName(con,name);
if(find<0)
{
printf("要修改的联系人数据不存在!\n);
return;
}
//手动调整格式
printf("%s %s %s %s %s\n","姓名","性别","年龄","电话","地址");
printf("%s %s %d %s %s\n",
con->arr[find].nme,
con->arr[find].gender,
con->arr[find].age,
con->arr[find].tel,
con->arr[find].addr
);
通讯录的测试方法
void ContactTest()
{
Contact con;//创建通讯录对象,实际上就是顺序表对象,等价于SL s1
ContactInit(&con);
}
test.c
void menu()
{
printf("**************************************");
printf("****1.增加联系人 2.删除联系人*****");
printf("****3.修改联系人 4.查找联系人*****");
printf("*****5.展示联系人 0.退出***********");
printf("**************************************");
}
int main()
{
int op=-1;
Contact con;
ContactInit(&con);
do{
menu();
printf("请选择您的操作:\n");
scanf("%d",&op);
switch(op)
{
case 1:
ContactAdd(&con);
case 2:
ContactDel(&con);
case 3:
ContactModify(&con);
case 4:
ContactFind(&con);
case 5:
ContactShow(&con);
case 0:
printf("退出通讯录!\n);
break;
default:
printf("输入错误,请重新输入!\n);
break;
}while(op!=0)
ContactDestory(&con);
return 0;
}
如何保证程序结束后,历史通讯录信息不会丢失:
void SaveContact(contact* con)
{
FILE* pf = fopen("contact.txt", "wb");
if (pf == NULL)
{
perror("fopen error!\n");
return;
}
//将通讯录数据写⼊⽂件
for (int i = 0; i < con->size; i++)
{
fwrite(con->a + i, sizeof(PeoInfo), 1, pf);
}
printf("通讯录数据保存成功!\n");
}