前不久学会了通讯录的实现,但是通讯录的大小始终是固定死的,当放满之后就不能再放入了,或者开辟的空间过大,只放入一两个联系人又造成空间的浪费。为了解决这个问题,在学习了动态内存分配后得以实现,话不多说,看看效果。
void init_contact(Contact* pc)//动态
{
assert(pc);
pc->sz = 0;
PeoInfo* ptr = (PeoInfo*)calloc(CAP_NUM, sizeof(PeoInfo));//CAP_NUM为3
if (ptr == NULL)
{
perror("init_contact::calloc");
return;
}
pc->data = ptr;
pc->capacity = CAP_NUM;
}
void check_capacity(Contact* pc)
{
if (pc->sz == pc->capacity)
{
PeoInfo* ptr = realloc(pc->data, (pc->capacity + INC_NUM) * sizeof(PeoInfo));
if (ptr == NULL)
{
perror("check_capacity::realloc");
return;
}
pc->data = ptr;
pc->capacity += INC_NUM;//该值是1
printf("已扩容\n");
}
}
当容量达到3之后,再次进行ADD时,检查容量的函数就会进行扩容,从而使容量增加,既解决了满了不够用的问题,还解决了开辟空间过大过于浪费的问题,当然,退出程序要释放申请的空间,避免出现额外的麻烦。
void destroy_contact(Contact* pc)
{
free(pc->data);
pc->data = NULL;
pc->capacity = 0;
pc->sz = 0;
}