通讯录升级--可增容(动态增长空间)
创始人
2024-05-12 20:27:54
0

通讯录成员的改变

之前我们定义了date[100]的数组用来存放100个人的信息,但是当需要存储的人数超过100时,内存不够,存储人数较少时,又有些浪费,并且数组空间在创建时就已经确立,无法随需求改变,因此我们希望让它可以动态变化。

这里我默认初始为3,每次不够了就增容2。(为了方便测试)

#define once_sz 2
#define init_sz 3

第一个参数为每次增容2,第二个参数为初始化为3.

typedef struct contact
{peopleinfo *date;int sz;int capacity;
}contact;

将date[n]改为一个peopleinfo类型的指针,便于接收我们调用内存分配函数后返回的void*起始地址

sz仍然表示现在已经有的人员信息数

新增capacity成员,用来表示现有的通讯录容量。

 

通讯录初始化

 void contact_init(contact* pc)
{assert(pc);pc->sz = 0;pc->capacity = init_sz;peopleinfo* ptr = (peopleinfo*)calloc(init_sz,sizeof(peopleinfo));if (NULL == ptr)//中间变量str判断是否成功开辟了一块空间{perror("contact_init:calloc");return;}pc->date = str;str=NULL:
}

sz初始化为0,capacity初始化为init_sz

然后利用calloc函数进行动态内存开辟,第一个参数为块数,第二个为每块空间的大小,因为每个元素都是人员信息peopleinfo,所以强制转换为peopleinfo。

然后创建一个中间变量ptr用来判断返回值是否为NULL,即是否成功开辟一块空间,判断完后,将ptr赋给date,用date指针来维护这一块空间,然后str可以置为空。

增加功能的升级

在增删查改、排序、显示功能中,仅增加和删除两个会改变当前的人员信息数,因此我们也要相应的增加/减少通讯录容量。

增加功能此前是判断sz是否达到最大元素sz,然后进行增加信息。

现在为了实现动态通讯录,我们增加增容功能,使其内存慢慢增加,按需增加,不再需要一个数组大小去限制它。

//增加人员信息
void contact_add(contact* pc)
{assert(pc);check_capacity(pc);//通讯录没满,添加信息printf("请输入姓名\n");scanf("%s", pc->date[pc->sz].name);printf("请输入年龄\n");scanf("%d", &pc->date[pc->sz].age);printf("请输入性别\n");scanf("%s", pc->date[pc->sz].sex);printf("请输入电话\n");scanf("%s", pc->date[pc->sz].tel);printf("请输入地址\n");scanf("%s", pc->date[pc->sz].dres);pc->sz++;
}

增容函数的实现

在增加人员信息前,先判断是否需要增容,如果需要,就进行增容。

当已有人员sz和capacity容量相同是需要增容。

增容过程利用realloc重新确定开辟空间的大小。

realloc第一个参数是重新开辟空间的起始地址,第二个是更新后的空间大小。

返回值用中间变量ptr接收,判断不为空指针后,用date指针来维护。

然后将ptr置空,相应的,容量capacity也要加上增量。


void check_capacity(contact* pc)
{if (pc->capacity == pc->sz){//相等时进行增容peopleinfo* ptr = (peopleinfo*)realloc(pc->date, (pc->capacity + once_sz) * sizeof(peopleinfo));if (NULL == ptr){perror("check_capacity:realloc");return;}pc->date = ptr;ptr = NULL;pc->capacity += once_sz;printf("增容成功\n");}
}

 当我们已有3个人员信息,再次添加后,显示增容成功。

减容函数的实现

当删除人员信息较多时,影响sz的量较大时,我们可以考虑减容以节省空间。

初始时,sz=0,capacity=3,差值为3,且相同时增量为2,因此我们可以在sz和capacity的差值大于3时进行减容。

#define d_value 3

这里我们定义一个减容的差值3,以后还可以改成其他数。

添加6个元素后,此时capacity为7,sz为6,现在开始删除元素

 

删除至3个,此时sz=3,capacity=7,差大于3,成功减容。 

退出时释放空间

前面我们多次使用malloc、calloc、realloc等内存开辟函数,但却没有释放,可能会导致内存泄漏问题,因此我们在退出通讯录时,一并进行释放操作。

//销毁通讯录
void contact_destroy(contact* pc)
{free(pc->date);pc->date = NULL;
}

将date指针指向的空间free,并将date置空即可。

动态内存开辟函数头文件是stdlib.h,返回地址要判断是否为空,还要进行free和置空操作。

目录

通讯录成员的改变

通讯录初始化

增加功能的升级

增容函数的实现

减容函数的实现

退出时释放空间


相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...