动态通讯录
本章内容基于上章内容实现,具体情况若有不清楚,请先查看上一篇文章。
动态通讯录实现了,动态开辟,如果存放满了,再开辟空间进行存储,相对静态更方便一些。
动态通讯录需要改造的地方
我们基于静态通讯录之上,来改造一下实现动态通讯录
需要改造的地方有:
结构体的改造
初始化函数
添加函数
退出通讯录
结构体的改造
静态的结构体是data是max也就是100。
typedef struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }PeoInfo; typedef struct Contact { PeoInfo data[MAX];//存放成员数据 int sz;//记录当前通讯录人数 }Contact;
Contact结构体中data数组是限定的,也就是100个。
动态通讯录的结构体代码如下:
typedef struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }PeoInfo; typedef struct Contact { PeoInfo* data;//存放成员数据 int sz;//记录当前通讯录人数 int capacity;//记录当前通讯录容量 }Contact;
在静态的基础之上,我们改动了data从数组改编成了指针指向的是动态内存开辟的PeoInfo,以及多了一个参数capacity来记录当前通讯录容量。
改造初始化函数
静态的初始化函数是这样的
void InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); }
直接把data成员里面全部赋值为0。
void InitContact(Contact* pc) { assert(pc); pc->sz = 0; pc->capacity = DEFAULT_SZ; pc->data = calloc(pc->capacity,sizeof(PeoInfo)); if (pc->data == NULL) { perror("InitContact->calloc"); return; } }
动态我们开辟一块内存用来存放PeoInfo的信息,而他的地址则让data指针指向即可,我们用if语句查看是否data指针为空,为空则提示一下calloc函数出错。
改造添加函数
添加函数与静态的不同则是通讯录不会再满了,因为我们满了我们会动态在开辟空间即可。
void ADDContact(Contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通讯录已满,无法增加\n"); return; } //增加信息 printf("请输入姓名:"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话号码:"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址:"); scanf("%s", pc->data[pc->sz].addr); // pc->sz++; printf("添加联系人成功!\n"); }
上面是静态的添加函数,接下来看一下动态的添加函数。
void ADDContact(Contact* pc) { assert(pc); if (pc->sz == pc->capacity) { PeoInfo* ptr = realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo)); if (ptr != NULL) { pc->data = ptr; pc->capacity += DEFAULT_INC; printf("增加联系人空间成功\n"); } else { perror("ADDContact->realloc"); } } //增加信息 printf("请输入姓名:"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话号码:"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址:"); scanf("%s", pc->data[pc->sz].addr); // pc->sz++; printf("添加联系人成功!\n"); }
我们首先判断通讯录由动态开辟的空间是否已满,满了则开辟新的空间,用realloc函数开辟即可,之后赋给PeoInfo类型的ptr指针。如果该指针不为空,那么再把ptr指针赋给data指针,之后让通讯录容量+2,在这里是为了方便测试,所以只加2,最后用printf函数提醒一下增加联系人空间成功,否则则提醒一下realloc函数出错。之后就可以正常添加信息。增加通讯录容量也可以单独封装成一个函数,感兴趣的话可以尝试一下。