🤖💻👨💻👩💻🌟🚀
🤖🌟 欢迎降临张有志的未来科技实验室🤖🌟
专栏:数据结构
👨💻👩💻 先赞后看,已成习惯👨💻👩💻
👨💻👩💻 创作不易,多多支持👨💻👩💻
🚀 启动创新引擎,揭秘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_stick
函数:
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_find
函数:查找联系人
static int p_arr_find(p_arr* ps, char* name)//查找
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
if (!strcmp(ps->arr[i].name, name)) //如果匹配strcmp返回0,取反得到1
{
return i;
}
}
return 0;
}
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为数字,需&操作
EXIT函数:退出函数
void EXIT(p_arr*ps)//退出
{
return ;
}
主函数 (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;
}
定义函数指针数组用来进入函数。
总结与反思
通过这个通讯录管理系统的实践,我们不仅复习了C语言的基础知识,还掌握了如何设计和实现一个小型项目。重点在于理解数据结构的选择、内存管理的重要性以及模块化编程的优势。此项目还可以进一步扩展,比如增加排序功能、采用文件存储实现持久化通讯录,或是引入更复杂的错误处理机制。
结束语与感谢
在本次深度探索中,我们不仅构建了一个实用的C语言通讯录管理系统,更重要的是,我们一同回顾并实践了数据结构、内存管理、函数设计及用户交互等核心编程技能。希望通过本教程,您能够感受到C语言的魅力所在,同时也为您的编程之旅增添一份宝贵的经验。
在此,衷心感谢每一位读者的耐心跟随与实践。无论是初学者的小试牛刀,还是资深程序员的温故知新,您的每一分努力都是推动技术成长的宝贵力量。编程之路漫漫,愿本文成为您探索之旅中的一盏明灯,引领您向更广阔的编程世界进发。
我们始终相信,技术的精进源自不懈的实践与学习。期待您在未来的编程道路上,能够创造出更多有意义、有价值的项目,不仅提升自我,也惠及他人。如果您在实践中遇到了新的挑战或有独到的见解,欢迎分享交流,共同促进技术社区的成长与进步。
最后,不要忘了享受编程带来的乐趣,正是这份热爱与执着,让代码不仅仅是冷冰冰的指令,而是充满创造力与温度的艺术品。
再次感谢您的阅读,期待在下一个项目中与您再次相遇!
致此,旅程虽暂告一段落,但编程的世界无限宽广,愿我们都能在代码的海洋里乘风破浪,探索不息。