上篇我们讲了顺序表是什么,和如何实现顺序表。这篇文章我们将基于顺序表来实现通讯录。
文章目录
- 前言
- 一、基于顺序表是如何实现的
- 二、通讯录的头文件和实现文件
- 三、通讯录的实现
- 3.1 定义通讯录结构
- 3.2 初始化通讯录
- 3.3 销毁通讯录
- 3.4 通讯录添加数据
- 3.5 查找联系人
- 3.6 删除联系人数据
- 3.7 通讯录联系人的修改
- 3.8 通讯录的查找
- 3.9 展示通讯录
- 3.10 测试函数
前言
一、基于顺序表是如何实现的
我们之前实现顺序表的时候,顺序表储存的是整型类型的数据。我们要想实现通讯录的话,那么存储的类型应该是储存自定义类型的数据。这个自定义类型的数据应该是结构体。
二、通讯录的头文件和实现文件
通讯录的实现是基于顺序表的,所以我们要在顺序表这个项目中创建通讯录的头文件和实现文件。
三、通讯录的实现
3.1 定义通讯录结构
先在通讯录的头文件在定义通讯录的结构
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDER_MAX 100
typedef struct personInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char adder[ADDER_MAX];
}peoInfo;
因为通讯录的实现是基于顺序表的,要将顺序表中存放的数组类型改为结构体类型,也就是我们定义的通讯录结构体。
typedef peoInfo SLDataType;
typedef struct SeqList
{
SLDataType* arr;
int size;
int capacity;
}SL;
注意不要忘了头文件。
下面就要在通讯录头文件中声明函数了,想一下。我们以后实现函数是不是要用到之前顺序表中定义好的函数。那么我们就应该在Contact.h头文件中引用顺序表的头文件。但是要注意一个问题。之前已经在顺序表头文件中引用了Contact.h这一头文件,如果再在通讯录头文件中引用SeqList.h这一头文件就重复了。所以在Contact.h中我们要前置声明一下。
typedef struct SeqList Contact;
3.2 初始化通讯录
在头文件中函数声明
void ContactInit(Contact* con);
在源文件中写具体的函数实现
void ContactInit(Contact* con)
{
SLInit(con);
}
这里就非常简单了,因为我们之前已经在顺序表中实现了初始化函数,直接调用就可以了。
3.3 销毁通讯录
在头文件中函数声明
void ContactDesTroy(Contact* con)
在源文件中写具体的函数实现
void ContactDesTroy(Contact* con)
{
SLDestroy(con);
}
这里和上面初始化通讯录一样。
3.4 通讯录添加数据
在头文件中函数声明
void ContactAdd(Contact* con)
在源文件中写具体的函数实现
void ContactAdd(Contact* con)
{
peoInfo info;
//姓名 性别 年龄 电话 地址
printf("请输入要添加联系人的姓名\n");
scanf("%s", info.name);
printf("请输入要添加联系人的性别\n");
scanf("%s", info.gender);
printf("请输入要添加联系人的年龄\n");
scanf("%d", &info.age);
printf("请输入要添加联系人的电话\n");
scanf("%s", info.tel);
printf("请输入要添加联系人的地址\n");
scanf("%s", info.adder);
SLPushBack(con, info);
}
用peoInfo info创建一个新的 peoInfo 类型的变量,用于存储即将添加到联系人列表中的个人信息。
SLPushBack(con, info);用顺序表中的尾插函数在通讯录的顺序表中进行尾插。
3.5 查找联系人
在头文件中函数声明
int FindByName(Contact* con, char name[])
在源文件中写具体的函数实现
int FindByName(Contact* con, char name[])
{
for (int i = 0;i<con->size;i++)
{
if (0 == strcmp(con->arr[i].name, name))
{
return i;
}
}
return -1;
}
遍历数组查找联系人。并且判断用到了一个strcmp函数。
3.6 删除联系人数据
在头文件中函数声明
void ContactDel(Contact* con)
在源文件中写具体的函数实现
void ContactDel(Contact* con)
{
char name[NAME_MAX];
printf("请输入要删除的姓名\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要删除的联系人不在\n");
}
SLErase(con, find);
printf("删除成功");
}
输入要找联系人的名字,用到上面我们写的查找联系人函数。如果找到了就删除,用到了顺序表中的删除函数。
3.7 通讯录联系人的修改
在头文件中函数声明
void ContactModify(Contact* con)
在源文件中写具体的函数实现
void ContactModify(Contact* con)
{
char name[NAME_MAX];
printf("请输入要修改的联系人数据");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要修改的联系人不存在\n");
}
//姓名 性别 年龄 电话 地址
printf("请输入新的姓名\n");
scanf("%s", con->arr[find].name);
printf("请输入新的性别\n");
scanf("%s", con->arr[find].gender);
printf("请输入新的年龄\n");
scanf("%d", &con->arr[find].age);
printf("请输入新的电话\n");
scanf("%s", con->arr[find].tel);
printf("请输入新的地址\n");
scanf("%s", con->arr[find].adder);
}
输入要修改联系人的姓名,判断一下存不存在。存在就重新输入。
3.8 通讯录的查找
在头文件中函数声明
void ContactFind(Contact* con)
在源文件中写具体的函数实现
void ContactFind(Contact* con)
{
char name[NAME_MAX];
printf("请输入要查找的联系人\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要查找的联系人不存在\n");
}
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%s %s %d %s %s\n",
con->arr[find].name,
con->arr[find].gender,
con->arr[find].age,
con->arr[find].tel,
con->arr[find].adder);
}
输入要查找联系人的姓名,判断一下存不存在。存在就打印出来。
3.9 展示通讯录
在头文件中函数声明
void ContactShow(Contact* con)
在源文件中写具体的函数实现
void ContactShow(Contact* con)
{
char name[NAME_MAX];
int find = FindByName(con, name);
if (find < 0)
{
printf("要查找的联系人不存在\n");
}
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < con->size; i++)
{
printf("%s %s %d %s %s\n",
con->arr[find].name,
con->arr[find].gender,
con->arr[find].age,
con->arr[find].tel,
con->arr[find].adder);
}
}
输入要查找联系人的姓名,判断一下存不存在。遍历数组,打印所有联系人的数据。
3.10 测试函数
#include"Contact.h"
#include"SeqList.h"
void meau()
{
printf("************** 通讯录 *************\n");
printf("******1.增加联系人 2.删除联系人******\n");
printf("******3.修改联系人 4.查找联系人******\n");
printf("******5.展示联系人 0.退出***********\n");
printf("**********************************\n");
}
int main()
{
int input = -1;
Contact con;
ContactInit(&con);
do {
meau();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
ContactAdd(&con);
break;
case 2:
ContactDel(&con);
break;
case 3:
ContactModify(&con);
break;
case 4:
ContactFind(&con);
break;
case 5:
ContactShow(&con);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
}
} while (input != 0);
ContactDesTroy(&con);
return 0;
}