🤖💻👨💻👩💻🌟🚀
🤖🌟 欢迎降临未来科技实验室🤖🌟
专栏:数据结构
👨💻👩💻 先赞后看,已成习惯👨💻👩💻
👨💻👩💻 创作不易,多多支持👨💻👩💻
🚀 启动创新引擎,揭秘C语言的密码🚀
项目概述
本通讯录管理系统旨在实现基本的联系人信息管理功能,包括添加、删除、查询、修改联系人信息以及显示通讯录列表。项目主要由三个文件构成:personinfo.h
(头文件)、personinfo.c
(功能实现)、main.c
(主函数及程序入口)。
技术要点概览
- 数据结构:定义
personinfo
结构体存储联系人信息,使用p_arr
结构体封装通讯录数组及其管理逻辑。 - 动态内存管理:通过
realloc
动态调整通讯录数组的大小,实现按需扩容。 - 功能模块化:将各个功能(如添加、删除、查询等)封装成独立的函数,提高代码的可读性和可维护性。
- 用户交互:通过
printf
和scanf
实现简单的命令行界面,使用户能够方便地与程序交互。
核心代码解析
数据结构定义 (personinfo.h
)
typedef struct {
int age;
char sex[4];
char number[11];
char name[20];
char address[20];
} personinfo;
typedef struct {
personinfo* arr;
int size;
int capacity;
} p_arr;
功能实现 (personinfo.c
)
menu函数:打印菜单
void menu()
{
printf("=====================================\n");
printf("============1.添加联系人=============\n");
printf("============2.删除联系人=============\n");
printf("============3.打印通讯录=============\n");
printf("============4.修改联系人=============\n");
printf("============0.退出通讯录=============\n");
printf("=====================================\n");
}
p_arr_init
函数:初始化通讯录
void p_arr_init(p_arr* ps)//将p_arr指向空指针,成员=0
{
ps->arr = NULL;
ps->capacity = ps->size = 0;
}
p_arr_check
函数:判断是否需要扩容
void p_arr_check(p_arr* ps)//检查是否需要扩容
{
if (ps->capacity == ps->size)
{
int new_capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
ps->arr = (personinfo*)realloc(ps->arr, new_capacity * sizeof(personinfo));
assert(ps->arr);
ps->capacity = new_capacity;
}
}
p_arr_pop
函数:删除联系人
void p_arr_pop(p_arr* ps)//删除联系人
{
assert(ps);
assert(ps->arr);
for (int i = 0; i < ps->size; i++)//讲赎罪内所有数据往后移一个位置
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;//有效数据数量-1
}
p_arr_stick
函数:添加联系人
void p_arr_stick(p_arr* ps)
{
// 省略了错误检查和输入代码,直接展示核心逻辑
scanf("%s %d %s %s %s", person.name, &(person.age), person.address, person.number,
person.sex);
p_arr_check(ps); // 自动扩容
ps->arr[ps->size++] = person; // 添加并更新size
}
p_arr_show
函数:打印通讯录
void p_arr_show(p_arr* ps)//打印
{
assert(ps);
assert(ps->arr);
system("cls");
int i = ps->size;
while (i > 0)
{
printf("姓名,年龄,地址,手机号码,性别\n");
printf("%s %d %s %s %s\n", ps->arr[i-1].name, ps->arr[i-1].age, ps->arr[i-1].address, ps->arr[i-1].number, ps->arr[i-1].sex);
i--;
}
Sleep(1000);
}
💡tips:在最后一行中的Sleep函数不要省略,防止看不到结果就被刷新
p_arr_revise
函数:修改联系人信息
void p_arr_revise(p_arr* ps)//修改
{
system("cls");
int input = 0;
do
{
printf("请输入要修改的名字\n");
char name[20] = {0};
scanf("%99s", name);
int res = p_arr_find(ps, name);
if (res == -1)
printf("该联系人不存在\n");
else
{
printf("0.exit 1.name 2.age 3.address 4.sex 5.number\n");
scanf("%1d", &input);
switch (input)
{
case 1:
{
printf("请输入\n");
scanf("%99s", ps->arr[res].name);
break;
}case 2:
{
printf("请输入\n");
scanf("%3d", &(ps->arr[res].age));
break;
}case 3:
{
printf("请输入\n");
scanf("%99s", ps->arr[res].address);
break;
}case 4:
{
printf("请输入\n");
scanf("%99s", ps->arr[res].sex);
break;
}case 5:
{
printf("请输入\n");
scanf("%99s", ps->arr[res].number);
break;
}case 0:
{
break;
}
default:
printf("错误输入\n");
}
}
} while (input);
}
💡tips:ps->arr[res].age为数字,需&操作
主函数 (main.c
)
主函数通过一个简单的菜单驱动程序来调用各项功能:
#include"personinfo.h"
int main()
{
typedef void (*ArrFunction)(p_arr*);
p_arr arr;
p_arr_init(&arr);//初始化
p_arr_check(&arr);//检查扩容
void (*pf[])(p_arr*) = {EXIT ,p_arr_stick,p_arr_pop,p_arr_show,p_arr_revise};
int x;
do {
menu();
scanf("%d", &x);
(*pf[x])(&arr);
system("cls");
} while (x);
return 0;
}
定义函数指针数组用来进入函数。
致此,旅程虽暂告一段落,但编程的世界无限宽广,愿我们都能在代码的海洋里乘风破浪,探索不息。