C语言实现通讯录—动态内存开辟

继上次实现通讯录后,我们发现一次性开辟1k个固定的空间大小,是不方便的。不如使用动态内存开辟,一开始先开辟出3个PeoInfo的大小,设置好capacity容量大小,当容量无剩余的时候,再去开辟出2个PeoInfo的空间。相当于初始存了3个联系人,当存满了再增加两个联系人的空间。

想要实现以上,需要更改Contact结构体,AddContact函数,DelContact函数,并且增加一个DestroyContact函数用来释放动态开辟后的空间。

void CheckCapacity(struct Contact* ps) {
	if (ps->size == ps->capacity) {
		//增容
		struct PeoInfo* ptr = realloc(ps->data, (ps->capacity + 2) * sizeof(PeoInfo));
		if (ptr != NULL) {
			ps->data = ptr;
			ps->capacity += 2;
			printf("增容成功\n");
		}
		else printf("增容失败\n");
	}
}
void AddContact(struct Contact* ps) {

	//检测当前通讯录的容量
	//1.如果满了,就增加空间
	//2.如果不满,啥事都不干
	CheckCapacity(ps);
	printf("请输入名字:>");
	scanf("%s", ps->data[ps->size].name);
	printf("请输入年龄:>");
	scanf("%d", &(ps->data[ps->size].age));
	printf("请输入性别:>");
	scanf("%s", ps->data[ps->size].sex);
	printf("请输入电话:>");
	scanf("%s", ps->data[ps->size].tele);
	printf("请输入地址:>");
	scanf("%s", ps->data[ps->size].addr);

	ps->size++;
	printf("添加成功\n");
	/*if (ps->size == MAX) {
	printf("通讯录已满,无法增加\n");
}
else {

}*/
}
void DelContact(struct Contact* ps) {
	char name[MAX_NAME];
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	//1.查找要删除的人
	int pos = FindByName(ps,name);
	//找到了返回名字所在元素的下标
	//找不到返回-1
	if (pos == -1) {
		printf("要删除的人不存在\n");
	}
	else {
		//2.删除
		int j = 0;
		for ( j = pos; j < ps->size; j++)
		{
			ps->data[j] = ps->data[j + 1];
		}
		ps->size--;
		ps->capacity++;
		printf("删除成功\n");
	}
}
void DestroyContact(struct Contact* ps) {
	free(ps->data);
	ps->data = NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值