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

文章目录

  • 静态版本contact
  • 总体思路
  • InitContact初始化动态版
  • AddContact动态版
  • 释放空间

静态版本contact

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

总体思路

动态版本目标:通讯录最开始可以放入n个人的信息,如果满了就自动扩容,每次增加m个人的容量
【动态内存管理】【C语言进阶】应用—通讯录contact2.0_第1张图片

//创建联系人结构体
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;
}

【动态内存管理】【C语言进阶】应用—通讯录contact2.0_第2张图片
【动态内存管理】【C语言进阶】应用—通讯录contact2.0_第3张图片

完整源码

你可能感兴趣的:(学习笔记,c语言)