相信大家已经看到我上一篇博客了,
这里想看静态通讯录的可以点击这里跳转静态通讯录实现
这里为啥要说一下动态通讯录呢?
因为我们学完了动态内存分配,我们要实践。所以我这里给大家实现一下动态通讯录
我们具体要改的地方就就三个地方
一个就是通讯录的初始化部分和通讯录的增加方法和通讯录的结构体部分
一.通讯录的结构
我们先增容,我们就要先改变通讯录的结构,你比较一下,我们之前的通讯录结构,你就明白,我们为什么要这么写。
//静态的版本
struct Contact {
struct PeoInfo data[MAX];//通讯录的大小
int sz;//记录通讯录的条数
};
//动态的版本
struct Contact
{
struct PeoInfo* data;
int sz;//通讯录的当前容量
int cap;//通讯录的容量
};
这里我们新增加了一个容量变量,就是为了我们之后的扩容容量,做参考用的。
二.通讯录的初始化方法
#define De_sz 3
void InitContact(struct Contact* pc)
{
assert(pc);
pc->data = (struct PeoInfo*)malloc(sizeof(struct PeoInfo) * De_sz);//申请方法
if (pc->data == NULL)
{
perror("InitPhone");
return;
}
pc->sz = 0;
pc->cap = 3;
}
三.通讯录的增容方法
我们在不断给通讯录增加人数的时候,静态通讯录中,我们是直接指定了,通讯录的大小的,如果有一天我们如果超过了,这个大小,就会增加失败,所以我们要对通讯录实现一个动态增容的改变。
代码如下:
#define Add_sz 2 //默认增容大小为俩个
int check_cap(struct Contact* pc)
{
//这里就是动态增容的关键步骤,当通讯录的人数和容量相等时,我们开始增容。
if (pc->sz == pc->cap)
{
struct P* ptr = (struct P*)realloc(pc->data, sizeof(struct P) * (pc->cap + Add_sz));
if (ptr != NULL)
{
pc->data = ptr;
pc->cap += Add_sz;
printf("增容成功\n");
return 1;
}
else
{
perror("AddPhone");
return 0;
}
}
else
{
return 1;
}
}
void AddContact(struct Contact* pc)
{
assert(pc);
if (check_cap(pc) == 0)
{
return;
}
printf("输入名字:");
scanf("%s", pc->data[pc->sz].name);
printf("输入性别:");
scanf("%s", pc->data[pc->sz].sex);
printf("输入年龄:");
scanf("%d", &(pc->data[pc->sz].age));
printf("输入电话号码:");
scanf("%s", pc->data[pc->sz].tel);
printf("输入地址:");
scanf("%s", pc->data[pc->sz].adress);
pc->sz++;
printf("成功添加\n");
}
四.关闭通讯录
在我们上一章,学习的动态内存分配的时候,我们开辟的内存要释放,当然我们这里通讯录,也不例外,我们在退出通讯录的时候,我们要对开辟的空间进行释放。
其实很简单,只需要在退出的时候,我们定义一个退出方法即可。
代码如下
void DestroyContact(struct Contact* pc)
{
free(pc->data);
pc->data = NULL;
pc->cap = 0;
pc->sz = 0;
}
这就是动态通讯录的全过程。
1137





