在上次我介绍顺序表后相信大家对顺序表有了一定的了解,现在就让我们来练练如何用它,这篇是在顺序表基础上新增的(建议看看线性表—顺序表实现-CSDN博客)。
目录
通讯录简介
创建用户信息
适配和理解通讯录
功能实现
初始化通讯录
销毁通讯录
增加用户信息
删除指定用户信息
查找用户信息
修改用户信息
显示用户信息
全代码
Contact.h
Contact.c
通讯录简介
下面是通讯录要实现的功能。
- 能够保存用户信息:名字、性别、年龄、电话、地址等。
- 增加用户信息。
- 删除指定用户信息。
- 查找用户信息。
- 修改用户信息。
- 显示用户信息。
创建用户信息
在创建用户信息前依然是要创建两个项目Contact.h,Contact.c用来存放新增的代码。
用户信息里包含名字,性别,年龄,电话,地址等这需要用结构体来定义。我把结构体给重命名为penInfo。数组的大小我把它定义为了常量(方便后期更改)。
#define NAME_MAX 20
#define GEMDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
typedef struct personInfo
{
char name[NAME_MAX];//名字
char gender[GEMDER_MAX];//性别
int age;//年龄
char tel[TEL_MAX];//电话
char addr[ADDR_MAX];//地址
}peoInfo;
typedef struct SeqList Contact;
大家可能注意到了这段代码的最后一行有这么一段话typedef struct SeqList Contact,有什么用呢?
我会在下面的适配和理解通讯录中详解。
适配和理解通讯录
之前顺序表的arr是指向int类型的指针,但现在它需要指向结构体。还记得为什么要创造SLDataType吗?它是用来表示arr的类型。所以只要把int换成penInfo就可以了 (这里要把Contact.h放在SeqList.h里否则penInfo是未定义的)。
//SeqList.c文件中
typedef peoInfo SLDataType;
现在让我们回到 typedef struct SeqList Contact 这段代码中。
再说之前要知道对通讯录操作其实就是对顺序表操作,即通讯录就是顺序表,这其实就是把顺序表的名字改为通讯录。
这里其实不写这段代码也是OK的。但是,你是要对通讯录操作。如果不改名字,那就是对顺序表操作(虽然它们一样)。你想啊,通讯录写的好好的突然出现顺序表,在我们看来还好但是对于其他人来说就很懵。这里改名字其实就是为了更方便理解。
既然想用顺序表那要在Contact.h里包含SeqList.h头文件,但是头文件是不能相互包含的。所以这里要对顺序表的结构体进行前置声明。这里不能用SL,因为是先定义完顺序表结构体之后在重命名的,如果直接用SL会被认为是未定义的。所以要用 struct SeqList 。
//这种是错误的!!! struct SeqList;//前置声明 typedef SL Contact;
这是正确的!!!
struct SeqList;//前置声明 typedef struct SeqList Contact;
可以把前置声明放在重命名里,最后就变成了这样。
typedef struct SeqList Contact;
用户信息的结构体就是放在通讯录的每一个下标里。
只要把这里给理解了,下面的代码就很轻松了。
功能实现
初始化通讯录
初始化调用一下SLInit函数就好。
//初始化
void ContactInit(Contact* con)
{
SLInit(con);
}
销毁通讯录
销毁调用一下SLDestroy函数就好。
//销毁
void ContactDesTroy(Contact* con)
{
SLDestroy(con);
}
增加用户信息
这里创建一个penInfo的变量info。然后一个一个输入内容。最后调用SLpushBack尾插即可。
//增加
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.addr);
SLpushBack(con, info);
printf("增加成功!\n");
}
大家可能注意到了只有年龄的scanf中加了&,为什么呢?
因为它不是数组,其它都是数组。
删除指定用户信息
在删除数据前要先检查有无该人,其实不光是删除还有查找,修改的函数都要用到。所以把它独立成一个函数,函数名是Findbyname。
我在这里是用名字来查找的,遍历一遍如果存在返回顺序表下标,否则返回-1。
判断是否存在的判断条件,我是用strcmp函数来实现的,如果它的返回值为0则存在。
int Findbyname(Contact* con, char name[])
{
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].name, name) == 0)
{
return i;
}
}
return -1;
}
剩下的要先创建一个数组来存放要删除人的名字,然后调用Findbyname函数,如果返回值小于0则退出。否则调用SLErase函数用来删除。
//删除
void ContactDel(Contact* con)
{
char name[NAME_MAX] = { 0 };
printf("请输入要删除联系人的名字;\n");
scanf("%s", name);
int find = Findbyname(con, name);
if (find < 0)
{
printf("该人不存在\n");
return;
}
SLErase(con, find);
printf("删除成功!\n");
}
注意:开辟数组的大小要和结构体(penInfo)的名字数组大小一样大。
查找用户信息
依然是要开辟数组然后调用Findbyname函数,如果小于0则退出,否则打印此人的信息。
//查找
void ContactFind(Contact* con)
{
char name[NAME_MAX] = { 0 };
printf("请输入要查找联系人的名字;\n");
scanf("%s", name);
int find = Findbyname(con, name);
if (find < 0)
{
printf("该人不存在\n");
return;
}
printf("名字 性别 年龄 电话 地址\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].addr);
}
修改用户信息
前面的代码同上,只不过如果返回值大于0则重新输入他的信息即可。
//修改
void ContactModify(Contact* con)
{
char name[NAME_MAX] = { 0 };
printf("请输入要修改联系人的名字;\n");
scanf("%s", name);
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("%d", &con->arr[find].age);
printf("请修改联系人的电话:\n");
scanf("%s", con->arr[find].tel);
printf("请修改联系人的地址:\n");
scanf("%s", con->arr[find].addr);
printf("修改成功!\n");
}
显示用户信息
遍历一遍的同时打印即可。
//展示
void ContactShow(Contact* con)
{
for (int i = 0; i < con->size; i++)
{
printf("名字 性别 年龄 电话 地址\n");
printf("%s %s %d %s %s\n",
con->arr[i].name,
con->arr[i].gender,
con->arr[i].age,
con->arr[i].tel,
con->arr[i].addr);
}
}
全代码
Contact.h
#define NAME_MAX 20
#define GEMDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
typedef struct personInfo
{
char name[NAME_MAX];//名字
char gender[GEMDER_MAX];//性别
int age;//年龄
char tel[TEL_MAX];//电话
char addr[ADDR_MAX];//地址
}peoInfo;
typedef struct SeqList Contact;
//初始化
void ContactInit(Contact* con);
//销毁
void ContactDesTroy(Contact* con);
//增加
void ContactAdd(Contact* con);
//删除
void ContactDel(Contact* con);
//修改
void ContactModify(Contact* con);
//查找
void ContactFind(Contact* con);
//展示
void ContactShow(Contact* con);
Contact.c
#include "SeqList.h"
#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("%d", &info.age);
printf("请输入联系人的电话:\n");
scanf("%s", info.tel);
printf("请输入联系人的地址:\n");
scanf("%s", info.addr);
SLpushBack(con, info);
printf("增加成功!\n");
}
int Findbyname(Contact* con, char name[])
{
for (int i = 0; i < con->size; i++)
{
if (strcmp(con->arr[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//删除
void ContactDel(Contact* con)
{
char name[NAME_MAX] = { 0 };
printf("请输入要删除联系人的名字;\n");
scanf("%s", name);
int find = Findbyname(con, name);
if (find < 0)
{
printf("该人不存在\n");
return;
}
SLErase(con, find);
printf("删除成功!\n");
}
//修改
void ContactModify(Contact* con)
{
char name[NAME_MAX] = { 0 };
printf("请输入要修改联系人的名字;\n");
scanf("%s", name);
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("%d", &con->arr[find].age);
printf("请修改联系人的电话:\n");
scanf("%s", con->arr[find].tel);
printf("请修改联系人的地址:\n");
scanf("%s", con->arr[find].addr);
printf("修改成功!\n");
}
//查找
void ContactFind(Contact* con)
{
char name[NAME_MAX] = { 0 };
printf("请输入要查找联系人的名字;\n");
scanf("%s", name);
int find = Findbyname(con, name);
if (find < 0)
{
printf("该人不存在\n");
return;
}
printf("名字 性别 年龄 电话 地址\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].addr);
}
//展示
void ContactShow(Contact* con)
{
for (int i = 0; i < con->size; i++)
{
printf("名字 性别 年龄 电话 地址\n");
printf("%s %s %d %s %s\n",
con->arr[i].name,
con->arr[i].gender,
con->arr[i].age,
con->arr[i].tel,
con->arr[i].addr);
}
}
好了讲到这儿就差不多讲完了,希望你能有所收获。如果有错误的地方请及时指出,有什么不懂的地方可以私信我哈。