通讯录的改造:
1.创建了就有1000个元素~(静态的版本)
2.动态增长的版本:a>默认运行起来的程序能放存3个人的信息
b>当通讯录放满的时候,每次增加2个人的空间
就是:3+2+2+2........
//sz--记录通讯录保存的个数;con记录储存个人信息(静态版本) //typedef struct contact //{ // peoInfo pos[NUME_MAX]; // int sz; //}contact;
这个结构体需要改造成动态增长版本。
//动态增长版本。 typedef struct contact { peoInfo *pos; int sz; int capacity; }contact;
sz还记录通讯录存的个人信息的个数;而心中的 capacity的作用就是容量(就是通讯录现在的最大容量,例如刚开始是3个当存满后就是与sz 相等这个时候再添加就需要扩充通讯录的容量了。)
刚开始初始化的时候就需要在堆上开辟空间。
//初始化,通讯录。(静态版本) //void Init_cotact(contact* pc) //{ // memset(pc->pos, 0, NUME_MAX); // pc->sz = 0; //} //动态增长版本。 void Init_cotact(contact* pc) { assert(pc); pc->sz = 0; pc->capacity = NUME_CAP; //NUME_CAP是定义的宏,数值是3. pc->pos=(peoInfo*)malloc(pc->capacity*sizeof(peoInfo));//堆上开辟空间。 if (pc->pos == NULL) { perror("Init_cotact::malloc");//如果开辟失败,返回错误信息。 return; } memset(pc->pos, 0, pc->capacity * sizeof(peoInfo));//初始化为0。 }
/*if (pc->sz == NUME_MAX) { printf("通讯录已满\n"); return; }*/
静态版本这个需要改为动态版本的 我们可以单独封装一个函数
void CheckCapacity(contact* pc) { if (pc->sz == pc->capacity) { peoInfo* tmp = (peoInfo*)realloc(pc->pos, (pc->capacity + 2) * sizeof(peoInfo)); if (tmp != NULL) { pc->pos = tmp; pc->capacity += 2; printf("通讯录已满,现已增容成功\n"); } else { perror("CheckCapacity::malloc"); return; } } }
当然做完这些不要忘了,把堆上申请的空间释放了(就是还给操作系统)
在最后(就是退出的地方,EXIT是枚举类型的第一个常量值就是0)添加一个销毁函数来执行。
//销毁通讯录。 void DestroyContact(contact* pc) { assert(pc); free(pc->pos); pc->pos = NULL; pc->capacity = 0; pc->sz = 0; printf("通讯录销毁成功\n"); }