C语言实战教程:构建简易通讯录管理系统

🤖💻👨‍💻👩‍💻🌟🚀

🤖🌟 欢迎降临未来科技实验室🤖🌟

              专栏:数据结构            

👨‍💻👩‍💻 先赞后看,已成习惯👨‍💻👩‍💻

👨‍💻👩‍💻 创作不易,多多支持👨‍💻👩‍💻

🚀 启动创新引擎,揭秘C语言的密码🚀


项目概述

本通讯录管理系统旨在实现基本的联系人信息管理功能,包括添加、删除、查询、修改联系人信息以及显示通讯录列表。项目主要由三个文件构成:personinfo.h(头文件)personinfo.c(功能实现)main.c(主函数及程序入口)

技术要点概览

  • 数据结构:定义 personinfo 结构体存储联系人信息,使用 p_arr 结构体封装通讯录数组及其管理逻辑。
  • 动态内存管理:通过 realloc动态调整通讯录数组的大小,实现按需扩容。
  • 功能模块化:将各个功能(如添加、删除、查询等)封装成独立的函数,提高代码的可读性和可维护性。
  • 用户交互:通过printfscanf实现简单的命令行界面,使用户能够方便地与程序交互。

核心代码解析

数据结构定义 (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;
}

定义函数指针数组用来进入函数。


致此,旅程虽暂告一段落,但编程的世界无限宽广,愿我们都能在代码的海洋里乘风破浪,探索不息。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值