继上次实现通讯录后,我们发现一次性开辟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;
}