通讯录升级--可增容(动态增长空间)

news2024/11/26 16:40:24

通讯录成员的改变

之前我们定义了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和置空操作。

目录

通讯录成员的改变

通讯录初始化

增加功能的升级

增容函数的实现

减容函数的实现

退出时释放空间


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rabbitmq+netcore6 【6】RPC:远程过程调用

文章目录1)前言2)Client interface 客户接口3)Callback queue回调队列4)Correlation Id 关联Id5)Summary总结6)综合以上代码准备工作服务端客户端结果验证官网参考链接: https://www.rabbitmq.c…

372. 超级次方

372. 超级次方题目算法设计:迭代算法设计:递归题目 传送门:https://leetcode.cn/problems/super-pow/ 题目不难懂,问题在于 b 是一个非常非常大的数,会溢出。 迭代和递归,各有解决方法,记录在…

Elasticsearch入门——kibanna和postman操作Elasticsearch索引示例

目录一、使用kibanna操作Elasticsearch索引示例二、使用postman操作Elasticsearch索引示例三、kibanna和postman操作Elasticsearch的总结一、使用kibanna操作Elasticsearch索引示例 启动Elasticsearch和kibanna服务,浏览器访问http://localhost:5601/,进入Dev Tools…

week11

T1汤姆斯的天堂梦 题目描述 汤姆斯生活在一个等级为 000 的星球上。那里的环境极其恶劣,每天 121212 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 NNN 的星球上天堂般的生活。 有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶…

【C语言】数据结构基础(每日小细节025),有三数之和哦

算法好题初阶(一共14回已经更新完毕),从今天开始就是基础的数据结构题目 1.只出现一次的数字 如果不额外开辟任何空间的话一定要想到位运算符 异或^ :两个整数异或,遵循相同为0,相异为1的二进制位运算规则 &#x…

【Nginx 基础】

Nginx 的安装 Nginx 的静态网站部署 理解 Nginx 的反向代理与负载均衡,能够配置反向代理与负载均衡 一、 Nginx 概述 Nginx 是一款高性能的 HTTP 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序工程师伊戈…

spring学习系列

Spring_三种方式的依赖注入1.第一种,set方式,property2.构造器注入(构造方法)3.p命名空间注入4、注入各种数据类型//老师类 public class Teacher {private String name;private int age; }//课程类 public class Course {private…

云原生技术学习笔记(基础版)

一、容器基本概念容器运行时,多种虚拟化技术,runC、kata、gVisor等。containerd -shim不是个lib,是个守护进程,管理容器生命周期,可被containerd动态接管。(可以从containerd中脱离出来,插件化管理&#xf…

jvm系列(1)--JVM和Java体系架构

目录Java-跨平台的语言JVM-跨语言的平台多语言混合编程虚拟机虚拟机概念Java虚拟机JVM的位置JVM的整体结构Java代码执行流程JVM的架构模型基于栈的指令集架构基于寄存器的指令级架构两种架构的举例JVM架构总结JVM的生命周期虚拟机的启动虚拟机的执行虚拟机的退出Java-跨平台的语…

VTK-vtkSelectPolyDataFilter

前言:本博文主要记录vtkSelectPolyDataFilter接口的应用,实现原理,以及与其近似的vtkClipPolyData&vtkImplicitSelectionLoop的应用相比较,帮助小伙伴理解vtkSelectPolyDataFilter接口的实现原理,并且与其它接口进…

2023新生个人训练赛第08场解题报告

问题 A: Candies 题目描述 We have a 2N grid. We will denote the square at the i-th row and j-th column (1≤i≤2, 1≤j≤N) as (i,j). You are initially in the top-left square, (1,1). You will travel to the bottom-right square, (2,N), by repeatedly moving ri…

鉴源论坛 · 观通丨轨交系统安全性设计

作者 | 刘艳青 上海控安安全测评中心安全测评部测试经理 版块 | 鉴源论坛 观通 引语:第一篇对轨交信号系统从铁路系统分类和组成、城市轨交系统分类和组成、城市轨交系统功能、城市轨交系统发展方面做了介绍,第二篇从信号基础出发,讲述了信…

【蓝桥杯算法 1】AcWing166.飞行员兄弟

本文已收录专栏 🌲《蓝桥杯周训练》🌲 “飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有 16 个把手的冰箱。 已知每个把手可以处于以下两种状态之一:打开或关闭。 只有当所有把手都打开时,冰箱才会打开。 把手可…

支持数位板的远程软件,实现远程使用 Wacom 数位板

现在数位板越来越流行了,影视、动漫、游戏、设计等行业经常需要用到。Wacom 是数位板领域的全球领导者,其设备为创意人员带来了真正的纸感绘图体验。 数位板用户需要远程办公的时候,经常会遇到两个问题:远程软件不支持数位板、远…

(考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例

文章目录一:计算机网络结构分层的必要性(1)分层思想(2)计算机网络分层思想①:如何让两台计算机通过网线传输数据②:如何让分组在单个网络内传输③:如何让分组在网络间传输④&#xf…

SpringBoot项目练习

项目名称:旅游网站后台管理一:项目简介旅游网站后台管理,包括如下用户:旅游线路:线路图片:线路分类:旅行社:后台技术:springboot、mybatis、mybatis plus前台:bootstrap、…

测试开发 | 专项测试技术初识Hook

本文节选自霍格沃兹测试学院内部教材Hook 技术需要预先分析目标应用的源代码和逻辑,根据目标测试场景设置目标、逻辑和数据,然后运行时动态的对目标函数参数值、逻辑或者返回值做修改,达到修改现有函数逻辑、实现目标测试场景的目的。Hook的价…

JavaWeb基础(一) Mybatis使用详解

JavaWeb基础——Mybatis 1,配置文件实现CRUD 如上图所示产品原型,里面包含了品牌数据的 查询 、按条件查询、添加、删除、批量删除、修改 等功能,而这些功能其实就是对数据库表中的数据进行CRUD操作。接下来我们就使用Mybatis完成品牌数据的…

3-2存储系统-主存与CPU的连接外部存储器

文章目录一.主存与CPU的连接(一)连接原理(二)主存容量的扩展1.位扩展法2.字扩展法3.字位同时扩展法(三)存储芯片的地址分配和片选1.线选法2.译码片选法二.外部存储器(一)磁盘储存器1…

JVM-三色标记

一、什么叫三色标记三色也叫三色抽象,它是所有mutator和collector都必须遵守的定律。它把对象标记为三种颜色:白色:对象还未被垃圾收集器访问,在回收的开始阶段所有的对象均为白色(当然了这只是指概念上的,…