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>