C语言实现简易通讯录:结构体、增删改查与排序全流程
本教程详细解析如何使用 C 语言构建一个包含增、删、改、查、排序功能的简易通讯录系统。通过合理设计 Peoinfo 和 Contact 结构体,配合函数模块化编程,实现对 1000 条联系人信息的完整管理,适用于初学者理解指针、数组及字符串处理。
程序设计思路
通讯录的核心需求是高效存储和检索多组具有相同特征的数据(如姓名、年龄、电话等)。因此,程序设计分为两个层次:
- 单个人信息层:使用结构体封装个人的详细信息。
- 通讯录整体层:使用一个包含最大容量数组和当前有效数量计数的结构体来管理所有人员。
第 1 步:定义数据结构
首先,在头文件 contact.h 中定义常量宏及两个关键结构体。这不仅是数据定义的起点,也是后续所有函数声明的基础入口。
- 人员信息结构体:用于存储单个联系人的字段。
- 通讯录结构体:作为容器,持有人员数组和数据计数。
#define Max 1000
#define name_Max 20
#define sex_Max 5
#define addr_Max 30
#define phone_Max 12
// 个人基本信息
typedef struct Peoinfo
{
char name[name_Max];
int age;
char sex[sex_Max];
char addr[addr_Max];
char phone[phone_Max];
}Peoinfo;
// 通讯录容器
typedef struct Contact
{
Peoinfo data[Max]; // 固定大小数组存放数据
int sz; // 记录当前有效联系人数量
}Contact;
主框架与菜单交互
程序的运行逻辑依赖于一个无限循环等待用户输入。为了提升代码可读性,建议使用 enum(枚举)替代硬编码的数字常量。
第 2 步:构建主循环与菜单
在 test.c 中,编写 main 函数并调用初始化函数,确保每次程序启动时状态干净。
#include "contact.h"
enum Option {
EXIT,
ADD,
DEL,
SEARCH,
SORT,
SHOW,
CLEAR
};
void menu()
{
printf("***************************\n");
printf("*** 1.Add 2.Del ***\n");
printf("*** 3.Search (Modify) ***\n");
printf("*** 4.Sort 5.Show ***\n");
printf("*** 6.Clear 0.Exit ***\n");
printf("***************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con); // 必须首先初始化
do
{
menu();
printf("请选择 > ");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DeletContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case SORT:
SortContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case CLEAR:
ClearContact(&con);
break;
case EXIT:
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input); // input为0时退出循环
return 0;
}
核心功能实现细节
第 3 步:数据添加
新增逻辑位于 contact.c。需注意两点:
1. 边界检查:若 sz == Max,则拒绝添加。
2. 索引定位:新数据始终写入 data[sz] 位置,写入成功后自增计数器。
void AddContact(Contact* pc)
{
if (pc->sz == Max)
{
printf("通讯录已满,无法添加!\n");
return;
}
// ... 省略中间输入代码 ...
printf("请输入名字: ");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄: ");
scanf("%d", &(pc->data[pc->sz].age));
// ... 其他字段类似 ...
pc->sz++; // 更新实际人数
printf("添加成功\n");
}
第 4 步:查找与删除
查找和删除都依赖一个公共辅助函数 FindByname,该函数遍历数组,若找到同名联系人则返回其下标,否则返回 -1。查找成功后可紧接着进行“修改”或“删除”操作。
static int FindByName(Contact* pc, const char* name)
{
for (int i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
删除操作的原理是覆盖法:从待删除位置开始,将后一位的数据拷贝到前一位,直到末尾,最后计数器 sz 减一。注意不要使用 free 或手动置空整个内存块,保持数组连续性即可。
第 5 步:显示与清空
显示使用格式化输出 printf("%-10s %5d..."), 保证表格整洁。
清空并非释放内存,而是重置状态。直接复用初始化逻辑,将 sz 归零并用 memset 清理数据。
常用库函数应用
开发过程中大量使用了标准库中的字符串及内存操作函数,需确保包含正确的头文件:
<string.h>:用于strcmp(比较)、strcpy(复制) 及memset(初始化)。<stdlib.h>:若涉及更复杂的排序算法可能需要调用qsort(快速排序),但在基础版中通常演示冒泡排序或使用上述标准库。<stdio.h>:输入输出控制。<assert.h>:在函数入口增加断言,确保传入的指针非空。
总结
通过该项目,掌握了 C 语言结构体的嵌套定义以及数组元素的动态增删技巧。代码按 test.c (测试)、contact.h (接口)、contact.c (实现) 拆分,符合工程化规范。以上就是 C 语言实现简易通讯录的详细内容,更多关于 C 语言项目实战的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









