C语言进阶习题【2】(4结构体进阶)——通讯录的实现2

1. 本节实现动态的通讯录实现

在静态版本的基础上,对于通讯录的创建和初始化进行了修改,还修改了add函数,新增了增容函数,和销毁函数。

2. 具体实现

2.0 通讯录创建——动态版本

//动态通讯录版本,空间不够就进行增加
typedef struct Contact
{
   
	PeoInfo* data;//指向存放通信录中人的信息的空间
	int sz;//当前已经存放的个人信息个数
	int capacity;//记录当前通讯录的最大容量
}Contact;

2.1 通讯录初始化——动态版本

//通讯录初始化——动态版本
void InitContact(Contact* pc)
{
   
	assert(pc);
	PeoInfo *ptr = (PeoInfo*)calloc( DEFAULT_SZ, sizeof(PeoInfo));//使用calloc不对其进行初始化。
	if (ptr == NULL)
	{
   
		perror("InitContact::calloc");
		return;
	}
	pc->data = ptr;
	pc->capacity = DEFAULT_SZ;//默认是3个,每次增容增2个
	pc->sz = 0;
}

2.2 增容函数

 
void check_capacity(Contact* pc)
{
   
	if (pc->sz == pc->capacity)
	{
   
		PeoInfo* ptr = (PeoInfo * )realloc(pc->data, pc->capacity * sizeof(PeoInfo));
		if (ptr == NULL)
		{
   
			perror("check_capacity::realloc");
			return;
		}
		pc->data = ptr;
		pc->capacity += INC_SZ;
		printf("增容成功!\n");
	}
}

2.3 修改给通讯录中增加联系人函数

//给通讯录中增加联系人信息——动态增长版本
void addContact(Contact* pc)
{
   
	assert(pc);
	check_capacity(pc);
	//添加联系人信息
	printf("请输入你要增加人的名字:\n");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入你要增加人的年龄:\n");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入你要增加人的性别:\n");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入你要增加人的地址:\n");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入你要增加人的电话:\n");
	scanf("%s", pc->data[pc->sz].tele);

	pc->sz++;
}

2.4 销毁函数

我们动态申请了内存,就一定要释放

//销毁通讯录
void destroyContact(Contact* pc)
{
   
	free(pc->data);
	pc->data = NULL;
	pc->capacity = NULL;
	pc->sz = 0;
	pc = NULL;
	printf("销毁成功\n");
}

2.5 验证

在这里插入图片描述

3. 源代码

3.1 contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once

#include <stdio.h>
#include<assert.h>
#include<string.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值