基于顺序表完成通讯录项目

在上一篇文章中,我们已经掌握了顺序表的基本原理与实现方法。接下来,我们将基于顺序表这一数据结构,完成一个实际的通讯录管理系统项目。

一、通讯录项目的设计与实现

为方便理解与参考,后续将提供完整的代码仓库链接(如 Gitee)。

在顺序表基础部分,我们使用 typedefint 类型重命名为 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;

下面开始实现通讯录的各项功能:

  1. 通讯录初始化

contact.h 中声明初始化函数:

c

arduino 复制代码
void ContactInit(Contact* pcon);

在测试文件 test.c 中进行功能验证。实际实现时,直接调用顺序表中已封装的初始化函数即可:

c

scss 复制代码
void ContactInit(Contact* pcon) {
    SLInit(pcon);  // 复用顺序表的初始化
}
  1. 通讯录销毁

同样地,销毁函数也直接复用顺序表的实现:

c

scss 复制代码
void ContactDestroy(Contact* pcon) {
    SLDestroy(pcon);
}
  1. 添加联系人

声明添加函数:

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);  // 将联系人信息添加到顺序表末尾
}
  1. 显示通讯录

声明显示函数:

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);
    }
}
  1. 删除联系人

声明删除函数:

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");
    }
}
  1. 查找与修改功能
  • 查找联系人

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: [链接地址]

相关推荐
azhou的代码园43 分钟前
基于SpringBoot+微信小程序的图片识别科普系统
spring boot·后端·微信小程序
Tony Bai1 小时前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
用户3167361303421 小时前
javaLangchain4j从官方文档入手,看他做了什么——具体使用(二)
后端
無名路人1 小时前
Zsh 脚本 + VS Code 任务:NestJS + Vue3 一键部署到 1Panel
运维·后端·自动化运维
ybwycx2 小时前
springboot之集成Elasticsearch
spring boot·后端·elasticsearch
程途知微3 小时前
AQS 同步器——Java 并发框架的核心底座全解析
java·后端
iPadiPhone3 小时前
分布式架构的“润滑剂”:RabbitMQ 核心原理与大厂面试避坑指南
分布式·后端·面试·架构·rabbitmq
武子康3 小时前
大数据-255 离线数仓 - Apache Atlas 数据血缘与元数据管理实战指南
大数据·后端·apache hive
javaTodo3 小时前
IntelliJ IDEA 2026.1 上强度了:Spring 运行时 Debug + AI 全面接入,太香了
后端
晴栀ay4 小时前
Generator + RxJS 重构 LLM 流式输出的“丝滑”架构
javascript·后端·llm