在上一篇文章中,我们已经掌握了顺序表的基本原理与实现方法。接下来,我们将基于顺序表这一数据结构,完成一个实际的通讯录管理系统项目。
一、通讯录项目的设计与实现
为方便理解与参考,后续将提供完整的代码仓库链接(如 Gitee)。
在顺序表基础部分,我们使用 typedef 将 int 类型重命名为 SLDataType。而在通讯录项目中,我们将把 SLDataType 重新定义为表示联系人的结构体类型。
首先创建头文件 contact.h,定义通讯录中需要存储的数据结构:
c
scss
// contact.h
typedef struct PersonInfo {
char name[50];
char phone[20];
char address[100];
// 可根据需要继续添加其他字段
} ContactInfo;
接下来,在顺序表的头文件 Seqlist.h 中,将原来的 int 类型替换为上面定义的 ContactInfo 结构体:
c
arduino
// Seqlist.h
#include "contact.h"
typedef ContactInfo SLDataType; // 将顺序表元素类型改为联系人信息
同时,为了更好地体现模块功能,我们将顺序表结构体重命名为 Contact:
c
arduino
typedef struct SeqList {
SLDataType* arr;
int size;
int capacity;
} Contact;
下面开始实现通讯录的各项功能:
- 通讯录初始化
在 contact.h 中声明初始化函数:
c
arduino
void ContactInit(Contact* pcon);
在测试文件 test.c 中进行功能验证。实际实现时,直接调用顺序表中已封装的初始化函数即可:
c
scss
void ContactInit(Contact* pcon) {
SLInit(pcon); // 复用顺序表的初始化
}
- 通讯录销毁
同样地,销毁函数也直接复用顺序表的实现:
c
scss
void ContactDestroy(Contact* pcon) {
SLDestroy(pcon);
}
- 添加联系人
声明添加函数:
c
arduino
void ContactAdd(Contact* pcon);
实现时,先创建一个 ContactInfo 结构体变量,接收用户输入的各个字段信息,然后通过顺序表的尾插函数将其添加到通讯录中:
c
scss
void ContactAdd(Contact* pcon) {
ContactInfo info;
printf("请输入姓名:");
scanf("%s", info.name);
printf("请输入电话:");
scanf("%s", info.phone);
// 其他字段的输入...
SLPushBack(pcon, info); // 将联系人信息添加到顺序表末尾
}
- 显示通讯录
声明显示函数:
c
arduino
void ContactShow(const Contact* pcon);
实现时遍历顺序表,打印每个联系人的详细信息:
c
arduino
void ContactShow(const Contact* pcon) {
printf("%-10s %-15s %-20s\n", "姓名", "电话", "地址");
for (int i = 0; i < pcon->size; i++) {
printf("%-10s %-15s %-20s\n",
pcon->arr[i].name,
pcon->arr[i].phone,
pcon->arr[i].address);
}
}
- 删除联系人
声明删除函数:
c
arduino
void ContactDelete(Contact* pcon, const char* name);
删除前需要先查找指定联系人是否存在。我们实现一个查找函数,通过字符串比较来定位:
c
arduino
int FindByName(const Contact* pcon, const char* name) {
for (int i = 0; i < pcon->size; i++) {
if (strcmp(pcon->arr[i].name, name) == 0) {
return i; // 找到返回下标
}
}
return -1; // 未找到
}
void ContactDelete(Contact* pcon, const char* name) {
int pos = FindByName(pcon, name);
if (pos != -1) {
SLErase(pcon, pos); // 调用顺序表的指定位置删除
printf("删除成功!\n");
} else {
printf("未找到该联系人!\n");
}
}
- 查找与修改功能
- 查找联系人:
c
perl
void ContactFind(const Contact* pcon, const char* name) {
int pos = FindByName(pcon, name);
if (pos != -1) {
printf("找到联系人:\n");
printf("姓名:%s\n电话:%s\n地址:%s\n",
pcon->arr[pos].name,
pcon->arr[pos].phone,
pcon->arr[pos].address);
} else {
printf("未找到该联系人!\n");
}
}
- 修改联系人:
c
arduino
void ContactModify(Contact* pcon, const char* name) {
int pos = FindByName(pcon, name);
if (pos != -1) {
printf("请输入新的姓名:");
scanf("%s", pcon->arr[pos].name);
printf("请输入新的电话:");
scanf("%s", pcon->arr[pos].phone);
// 其他字段的修改...
printf("修改成功!\n");
} else {
printf("未找到该联系人!\n");
}
}
至此,通讯录的基本功能已全部实现。最后,可以在 test.c 中进一步完善用户界面,添加菜单选择等功能,使程序更加友好易用。
附:顺序表基础与通讯录项目的代码仓库链接
Gitee: [链接地址]