【动态内存管理】【C语言进阶】应用—通讯录contact2.0

静态版本contact

【C语言进阶】struct结构体的应用——通讯录(初级)

总体思路

动态版本目标:通讯录最开始可以放入n个人的信息,如果满了就自动扩容,每次增加m个人的容量
在这里插入图片描述

//创建联系人结构体
struct PeoInfo
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	char tel[TEL_MAX];
	int age;
	char addres[ADDR_MAX];
};

//静态版本
//struct Contact
//{
//	struct PeoInfo data[N_MAX];
//	int sz;
//};

//动态版本
struct Contact
{
	struct PeoInfo* data;
	int sz;
	int capacity;
};

InitContact初始化动态版

  1. malloc开辟空间,将此空间的地址赋值给pc->data
  2. 判断空间开辟是否成功
  3. 成功则分别初始化sz和capacity的大小
  • 定义初始化大小(通讯录中最开始可以放入Init_num个人的信息)和增加大小(每次扩容增加Inc_num个联系人的空间)为👇
    在这里插入图片描述
//初始化通讯录(动态版)
void InitContact(struct Contact* pc)
{
	assert(pc);
	pc->data = (struct PeoInfo*)malloc(Init_num * sizeof(struct PeoInfo));
	if (pc->data != NULL)
	{
		pc->sz = 0;
		pc->capacity = Inc_num;
	}
	else
	{
		perror("InitContact()");
		return;
	}
}

AddContact动态版

“通讯录已满,无法增加联系人的信息” → 封装一个函数 → 检查容量状态并判断是否需要扩容(Check_capacity)

Check_capacity的思路:

  1. 判断是否需要扩容(不需要扩容return 1
  2. 需要扩容→用realloc函数扩容(函数返回值用指针接收)
  3. 判断扩容是否成功(失败→return 0
  4. 扩容成功将地址赋值给pc->data,并改变pc->capacity的大小
  5. 扩容成功最终 → return 1
int Check_capacity(struct Contact* pc)
{
	assert(pc);
	if (pc->sz == pc->capacity)//**需要扩容的情况**
	{
		struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));
		if (ptr == NULL)
		{
			perror("AddContact()");
			return 0;
		}
		pc->data = ptr;
		pc->capacity += 2;
		printf("扩容成功\n");
		return 1;
	}
	//不需要扩容的情况
	return 1;
}

//增加联系人的信息到通讯录(动态版本)
void AddContact(struct Contact* pc)
{
	assert(pc);
	//首先判断能否增加信息(静态版本)
//	if (pc->sz == N_MAX)
//	{
//		printf("通讯录已满,无法增加联系人的信息\n");
//		return;
//	}
	if (0 == Check_capacity(pc))//判断能否增加信息
	{
		return;
	}
	else
	{
		printf("请输入联系人的名字:");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入联系人的性别:");
		scanf("%s", pc->data[pc->sz].gender);
		printf("请输入联系人的电话:");
		scanf("%s", pc->data[pc->sz].tel);
		printf("请输入联系人的年龄:");
		scanf("%d", &pc->data[pc->sz].age);//注意这里age不是数组名!要有‘&’
		printf("请输入联系人的地址:");
		scanf("%s", pc->data[pc->sz].addres);
		printf("成功增加联系人的信息\n\n");
		pc->sz++;
	}
}

释放空间

//释放内存
void DestroyContact(struct Contact* pc) 
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}

在这里插入图片描述
在这里插入图片描述

完整源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畋坪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值