通讯录功能描述:
- 增加联系人
- 删除联系人
- 修改联系人
- 查找联系人
- 显示所有联系人
- 退出通讯录
分三个文件实现:
- contact.h —— 函数和类型的声明
- contact.c —— 函数的实现
- test.c —— 测试通讯录
假设通讯录中可以存放100个人的信息。
每个人的信息包括:
姓名、年龄、性别、电话、住址。
这时,每个人的信息可以设计为一个结构体,
创建联系人的结构体类型
在contact.h文件中声明结构体类型
上面这段代码的数组大小被固定写死,后续想更改非常的麻烦,所以我们使用#define常量,使得将来修改更方便一些
简单版实现通讯录的简易菜单
在test.c中实现
菜单中包含将要实现的所有功能选项,不过多赘述
实现通讯录的基本运行逻辑
基本逻辑在test.c中实现
此时我们已经完成了通讯录的基本框架,但是上面的代码存在很多处不足,例如:
- case语句中的数字,(case 0:、case 1:…)这样的代码可读性较差,让人第一眼看上去并不知道,这是表示什么含义。
- 上面代码并没有联系人信息存放的位置,
函数内部的传入的参数也并不正确。
下面我们来解决上面这两个问题:
case语句中的0、1、2、3能否替换成其他可读性更好的代码呢?答案是肯定的。
我们使用枚举类型,定义选项,把case语句中的数字替换成选项:
类型的声明放在conta.h中
再来解决联系人信息的存放位置问题,因为我们将要存放的是联系人的信息,联系人的信息是需要存放在我们是事先声明的结构体变量中去的,那么存放多个联系人的信息就需要用到结构体数组。
当进行增删改查的操作时,我们需要将data的地址、sz变量
- 传入增加联系人函数进行操作
- 传入删除联系人函数进行操作
- 传入修改联系人函数进行操作
- 传入查找联系人函数进行操作
那么每次调用函数都传入两个函数,是不是有点太啰嗦了呢,所以我们采取以下措施:
将data数组和sz变量声明为一个结构体变量,这样后续进行函数传参的时候只需要传入一个结构体变量即可。
这里说明一下PeoInfo结构体和Contact结构体之间的关系:.
Contact结构体中包含(data数组 和 int类型的sz),data数组中存放了100个PeoInfo类型的变量,每一个PeoInfo变量中存放的都是联系人的姓名、年龄、性别、电话、地址这些信息。

解决了上面两个问题,我们再回到test.c文件
在上一段代码中,出现了很多函数,下面进行讲解:
函数的声明放在contact.h文件中
在contact.c文件中实现
在contact.c文件中实现
这里的pc->data[pc->sz],拿到的是data数组中下标为(pc->sz)的元素,pc->sz拿到的是con里的sz,也就是当前通讯录的联系人个数,当联系人为0时,我们添加联系人,应该放到data数组的第一个元素,也就是下标为0的位置,而sz又刚好等于0,所以 pc->data[pc->sz] 能拿到data数组的第一个元素,第一个元素是结构体变量,结构体变量访问结构体成员时候用 . 操作符,所以:

- pc->data[pc->sz].name 访问 PeoInfo结构体的第1个成员
- pc->data[pc->sz].age 访问 PeoInfo结构体的第2个成员
- pc->data[pc->sz].sex 访问 PeoInfo结构体的第3个成员
- pc->data[pc->sz].tel 访问 PeoInfo结构体的第4个成员
- pc->data[pc->sz].addr 访问 PeoInfo结构体的第5个成员
1.3.4.5.均为数组名,表示地址,可以直接作为参数传给scanf函数
2.拿到的是int类型的变量,scanf函数需要传入的参数为地址,所以需要&(pc->data[pc->sz].age)
在contact.c文件中实现
实现完增加联系人的函数,可以先实现展示通讯录函数,显示所有联系人,看看增加联系人是否成功。
这里的%-10s ,含义:打印左对齐长度为10的字符串, 为对齐
-为左对齐,10为打印字符串的长度,如果不加 -,则默认右对齐
在contact.c文件中实现
我们发现,当我们想要删除一个联系人,我们需要先找到这个联系人,于是我们需要一个查找联系人的函数,我们叫它通过姓名查找联系人函数,这样防止和后面查找联系人函数混淆,后面还会提到。
假设我们想删除下标为1的元素,我们只需要将下表为2 ~ sz的元素依次向前移动,下标为1的元素就被覆盖了,达到了删除的效果:

我们发现修改联系人函数前半段的实现方式和删除联系人大致相同,都需要先找到该联系人,然后重新存入联系人的每个信息,把原信息覆盖掉,达到修改的效果。
重新录入联系人信息的逻辑和添加联系人大致相同。
前面提到的那个“通过姓名查找联系人”函数,仅仅是查找到要查找的联系人并返回下标即可,而这里的查找联系人函数有所不同,它是为实现通讯录的查找功能服务的,需要找到联系人并且显示该联系人的信息,所以这里也要用到前面实现的“通过姓名查找联系人”函数。
到此,C语言版本的简易通讯录就结束啦~,感谢你的观看!