C语言动态内存练习:【通讯录(动态内存版本)实现】

全文目录

  • 😀 前言
  • 🤔 目标规划
  • 🤨 结构变化
  • 😵‍💫 功能实现的不同点
    • 🙄 添加功能 `AddContact`
      • 😍 扩容检查 `CheckCapacity`
    • 🙄 销毁通讯录 `DestroyContact`
  • 🌈 总结 + 源码

😀 前言

前面我们写了一个静态数组版本的通讯录,再结合刚学习的动态内存管理的知识,我们现在来实现一个动态内存版本的通讯录。

🤔 目标规划

动态内存版本的通讯录,主要还是为了解决静态数组版本的通讯录空间太大导致的内存浪费和空间太小不够存放的问题。

扩容策略:

为通讯录设置一个初始容量大小capacity,如果sizecapacity一样的,capacity扩大两个元素(如果觉得扩容操作太过频繁,可以实现二倍扩容)

🤨 结构变化

因为是动态内存版本,有扩容等操作,所以我们需要用capacity来表示空间的大小,size来表示使用了多少空间。其他的可以不用发生变化。

#define DEFAULT_CAPACITY 3	// 默认容量大小

typedef struct Contact 
{
	PeoInform* data;
	int size;
	int capacity;
} Contact;

😵‍💫 功能实现的不同点

既然结构变了,那么在实现功能的时候也会有点差异。

🙄 添加功能 AddContact

😍 扩容检查 CheckCapacity

再添加联系人之前我们需要先检查容量够不够,为了方便维护,我们还是封装一个函数。

// 检查增容
void CheckCapacity(Contact* con)
{
	assert(con);

	if (con->size == con->capacity)
	{
		PeoInform* temp = (PeoInform*)realloc(con->data, (con->capacity + 2) * sizeof(PeoInform));
		if (temp == NULL)
		{
			perror("CheckCapacity::realloc"); 
			return;
		}
		else
		{
			con->data = temp;
			con->capacity += 2;

			puts("扩容成功\n");
		}
	}
}

其他的还是老样子

// 添加联系人
void AddContact(Contact* con)
{
	assert(con);
	puts("");

	CheckCapacity(con);
	
	printf("请输入姓名 ->");
	scanf("%s", con->data[con->size].name);
	printf("请输入性别 ->");
	scanf("%s", con->data[con->size].sex);
	printf("请输入年龄 ->");
	scanf("%s", con->data[con->size].age);
	printf("请输入电话号码 ->");
	scanf("%s", con->data[con->size].telephon);
	printf("请输入地址 ->");
	scanf("%s", con->data[con->size].addrs);
	puts("");

	con->size++;

	printf("添加成功!\n");
}

🙄 销毁通讯录 DestroyContact

既然使用了动态内存,那么就需要注意内存泄漏问题,再退出之前需要将申请的空间释放。

// 销毁通讯录
void DestroyContact(Contact* con);
{
	assert(con);
	free(con->data);
	con->data = NULL;
	con->size = con->capacity = 0;
}

🌈 总结 + 源码

相较于静态数组,动态内存写起来更麻烦,但是对内存有着更加严谨的控制,所以还是推荐动态内存。

源码地址:动态内存版本通讯录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有趣的小知识(四)从基站到天线:深入了解如何优化网站速度的关键技术

一、全面认识基站 1.1 基站的定义 基站是一种通信设施,用于提供无线通信服务。它通常由一座塔、天线、收发信设备、电源和辅助设备等组成,可以与移动设备(如手机、平板电脑等)进行无线通信。基站是是无线终端(如手机)接入互联网…

寻找CSDN平行世界的另一个你

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 寻找CSDN平行世界的另一个你摘要前言列表测试目的摘要 本文作了一个测试,看看在 CSDN 的博文中,艾特()某个好友,TA是否能够…

为一副通用纸牌设计数据结构

为一副通用纸牌设计数据结构 大家好,我是易安,今天我们来聊一道笔试题,这也是我曾经面试华为时做过的题,今天分享给大家。 题目: 如何设计一个通用的扑克牌数据结构?请解释如何继承它来实现特定的扑克游戏…

国内外人工智能AI工具网站大全(一键收藏,应有尽有)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 国内外人工智能AI工具网站大全(一键收藏,应有尽有)摘要一、AI写作工具二、AI图像工具2.1、常用AI图像工具2.2、AI图片插画生成2.3、AI图片背景移除…

分享10个前端开发者需要掌握的DOM技巧

Web开发不断发展,掌握最新的趋势和最佳实践对每位开发者来说都至关重要。Web开发的最重要方面之一就是使用文档对象模型(DOM)。在本文中,我们将探讨10个必须掌握的DOM技巧和技巧,配有代码示例,这将帮助您成…

Kotlin 是后端开发的未来

Kotlin 是后端开发的未来 严格类型、命名参数、多范式语言 您今天遇到的每个后端开发人员都会说他们使用 JavaScript、Python、PHP 或 Ruby 编写代码。近年来,您会遇到一小部分人转而使用 Kotlin 作为他们创建 Web 服务器的语言选择。由于我在学习Ktor,所…

项目部署---shell脚本自动部署项目

通过shell脚本自动部署项目 操作步骤: 在Linux中安装Git在Linux中安装maven编写shell脚本(拉取代码、编译、打包、启动)为用户授予执行shell脚本的权限执行shell脚本 执行过程:Linux服务器(编译、打包、启动&#x…

巧用千寻位置GNSS软件|点测量状态栏与工具栏全解析

众所周知,点测量是提供点位坐标多种模式测量、测量模式切换、测量数据简单成图等多种方式的点位地理信息测量功能。下面我们来解析在千寻位置GNSS软件中点测量功能下的各状态栏和工具栏。图5.1-1点击【测量】->【点测量】,如图5.1-1 所示,…

面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码:面向削峰填谷的电动汽车多目标优化调度策略 关键词:电动汽车 削峰填谷 多目标 充放电优化 参考文档:店主自己整理的说明文档,公式、约束、数据齐全,可联系我查看 仿真平台:MATLAB YA…

Android 设置背景颜色透明度

前言 本章是对设计给出的颜色做透明度的处理 原因 一般情况下我们是不需要做处理的,那为什么又需要我们做透明度呢,原因就是咱们的设计小哥哥、小姐姐们没有自己做处理,如果处理了的话,我们直接使用设计标注的AHEX颜色就行&a…

Vue+echart 图根据网页自适应resize缩放

const chartBar null;data{return {chartBar :null} }//关键代码activated() {// 由于给echart添加了resize事件, 在组件激活时需要重新resize绘画一次, 否则出现空白bug// if (this.chartBar) {this.chartBar.resize();// }},chartBar echarts.init(document.getElementBy…

信息安全和网络安全

安全五要素: 机密 完整 并且能判断数据是否被篡改 可用 可控 可审查性 对于网络及网络交易,信息安全的基本需求是: 机密性完整性不可抵赖性 计算机系统安全保护的五个等级: 注释:其中的安全标记保护级是属于强…

【Spring】—Spring中Bean的配置、作用域

一、Bean的配置 Spring用于生产和管理Spring容器中的Bean,需要开发者对Spring的配置文件进行配置。在实际开发中,最常采用XML格式的配置方式,即通过XML文件来注册并管理Bean之间的依赖关系。 在Spring中,XML配置文件的根元素是…

深度学习在表面缺陷检测领域的应用

随着工业对原材料质量要求的提高,圆钢表面缺陷检测已成为工业生产的重要组成部分。 表面缺陷检测技术主要分为两类,即传统的无损检测方法和机器视觉检测方法,后者因其实时性和高精度而得到更广泛的应用。 作为现代工业生产的重要原材料&…

分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测

分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测 目录分类预测 | MATLAB实现CNN-BiLSTM-Attention多输入分类预测分类效果基本介绍模型描述程序设计参考资料分类效果 基本介绍 MATLAB实现CNN-BiLSTM-Attention多输入分类预测,CNN-BiLSTM结合注意力机制多输…

【教程】解决VSCode中Python第三方库无法自动补全

背景 学习ROS的时候,发现ROS的第三方库无法自动补齐 解决过程 查询到的一个解决方法是,禁用Pylance扩展 禁用之后第三方库可以自动补齐了但是原来自带库的语法高亮消失了此解决方法不是上策 解决方法 打开 .vscode 文件夹下面的 setting.json 文件 …

QN88封装国产FPGA

QN88GW1N-9管脚名GW2A-18管脚名AL3S10EG4S201VCCVCCIO_L1_1VCC_12VSSVSSIO_L2_1IO_L1_13IOL2AVCCO7IO_L3_1,MOSI,D1IO_L2_14IOL5A/JTAGSEL_N/LPLL_T_inIOL7A/LPLL1_T_inIO_L4_1IO_L1N_15IOL11A/TMSIOR25B/TMSIO_L5_1,SPICSNIO_L1P_16IOL11B/TCKIOR26A/TCKINITNGND7IOL12B/TDIIO…

常见漏洞扫描工具AWVS、AppScan、Nessus的使用

HVV笔记——常见漏洞扫描工具AWVS、AppScan、Nessus的使用1 AWVS1.1 安装部署1.2 激活1.3 登录1.4 扫描web应用程序1.4.1 需要账户密码登录的扫描1.4.2 利用录制登录序列脚本扫描1.4.3 利用定制cookie扫描1.5 扫描报告分析1.5.1 AWVS报告类型1.5.2 最常用的报告类型&#xff1a…

Hive小文件问题

1、小文件产生的原因 数据源本身有很多小文件:reduce数量多导致生成的小文件增多:使用动态分区导致小文件增多: 2、小文件危害 HDFS内存资源消耗过大,并限制了数据存储规模:在HDFS中,具体的文件保存在da…

静态链表常用操作(节点计数/查找/增加/删除)

1.封装计算链表节点个数的API 代码心得: cnt是count的缩写,用来计数。节点,我们一般指的是链表中数据的地址(指针)。比如节点1就是第一个结构体的地址,节点2就是第2个结构体的地址,以此类推。…
最新文章