C语言 动态通讯录实现(附源码)

news2024/11/18 19:47:56

欢迎来到 Claffic 的博客 💞💞💞

前言:

上期博客写了静态通讯录并且答应给大家写一个动态版,这不,它来了: 


1.动态版与静态版的区别

静态版的内存空间开辟大小是固定的,放了预期的最大值,并不会根据实际存放的数据而变化;

当需要存放的数据较少时,难免会出现内存的浪费,所以我们考虑申请动态内存开辟;

2.相关函数的介绍

2.1 malloc

开辟动态内存,最经典的就是 malloc 函数了:

函数的作用是向内存申请一块连续可用的空间,并返回指向这块空间的指针

用它需要传递一个无符号整型的参数:需要开辟的动态内存的大小,单位是字节

如果开辟成功,函数返回指向开辟好空间的指针;

如果开辟失败,函数返回NULL指针;

因此 malloc 的返回值要做检查。

但是,动态内存嘛,向内存申请了还是要还的

还内存也方便,用一个 free 函数就可以:

 

free 函数用来释放动态内存开辟的空间

如果 ptr 指向的空间不是动态内存开辟的,free 函数的行为未定义;

如果 ptr 是 NULL,函数不作为; 

另外注意,指针释放后小心变野哦,释放的指针要赋个 NULL; 

开辟动态内存,养成好习惯:

free(ptr);
ptr = NULL;

2.2 calloc

calloc 函数的作用也是申请动态内存,只不过比 malloc 更灵活些;

它为 num 个大小为 size 的元素开辟一块空间,

并且把空间的每个字节初始化为 0。

2.3 realloc

realloc 函数的出现让动态内存管理更加灵活;

realloc 函数的作用是调整动态开辟内存的大小;

函数返回调整之后的内存起始位置

ptr 是要调整的内存地址

size 是调整之后的新大小

3.实现过程 

做了以上铺垫,就可以开始正题了:

静态通讯录到动态通讯录,需要在哪动刀子呢? 

多是在添加联系人信息时开辟动态内存:

我们先给存放联系人一个初始空间,再定义一个扩容空间,按需扩容。

给通讯录结构体改一 加一:

typedef struct Contact
{
	PeoInform data[MAX];//存放的联系人
	PeoInform* data;//指向存放人的信息空间
	int sz;//当前已经存放的联系人个数
	int capacity;//当前通讯录的容量
}Contact;

然后在原来的添加联系人的基础上加入检查是否扩容的函数:

void* check_capacity(Contact* pc)
{
	assert(pc);
	if (pc->sz == pc->capacity)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//扩容
	PeoInform* ptr = (PeoInform*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInform));
	if (ptr == NULL)
	{
		perror("check_capacity");
		return;
	}
	pc->data = ptr;
	pc->capacity += INC_SZ;
	printf("扩容成功\n");
}

初始化也要相应改变:

void Init_Contact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
    PeoInform* ptr = (PeoInform*)calloc(DEFAULT_SZ, sizeof(PeoInform));
	if (ptr == NULL)
	{
		perror("Init_Contact");
		return;
	}
	pc->data = ptr;
	pc->capacity = DEFAULT_SZ;
}

退出时要销毁通讯录:

void Dtroy_Contact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	pc = NULL;
}

到这里基本上就可以了,已经化为动态版。

源码已上传至 我的 gitee,

拿走不谢 ~


总结:

静态版升级为动态版,实际上只是在申请内存上做了改动,重点是学会如何使用动态内存开辟。

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

关注我  不迷路!!!

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

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

相关文章

Leetcode 剑指 Offer II 010. 和为 k 的子数组

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数组和一个整数 k ,请找到该数组中和为…

MTBF是什么意思?交换机做MTBF有什么要求?MTTF、MTBF和MTTR的区别是什么?

MTBF,即平均故障间隔时间,英文全称是“Mean Time Between Failure”。是衡量一个交换机的可靠性指标。单位为“小时”。它反映了交换机的时间质量,是体现交换机在规定时间内保持功能的一种能力。具体来说,是指相邻两次故障之间的平…

【考研】2020-Part A 作文(英一)

可搭配以下链接一起学习: 【考研】2018-Part B 作文(英一)_住在阳光的心里的博客-CSDN博客 目录 一、2020 Part A (一)题目及解析 (二)优秀范文 (三)参考译文 &a…

Ansible playbook 讲解与实战操作

文章目录一、概述二、playbook 核心元素三、playbook 语法(yaml)1)YAML 介绍1、YAML 格式如下2、playbooks yaml配置文件解释3、示例2)variables 变量1、facts:可以直接调用2、用户自定义变量3、通过roles传递变量4、 Host Invent…

LINUX---文件

目录第一部分:文件编程一.打开/创建文件二.文件的写入操作三.文件的读取四.文件的光标应用:计算文件的大小第二部分:文件操作原理:一.文件描述符静态文件和动态文件第三部分:文件编程小应用1.实现CP命令2.修改文件3.写…

安卓玩机搞机技巧综合资源-----修改rom 制作rom 解包rom的一些问题解析【二十一】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

【Vue笔记】Vue组件的创建、使用以及父子组件数据通信常见的几种方式

这篇文章,主要介绍Vue组件的创建、使用以及父子组件数据通信常见的几种方式。 目录 一、Vue组件的使用 1.1、局部组件 1.2、全局组件 1.3、动态组件(组件动态切换) 1.4、缓存组件 (1)如何缓存组件 (…

微服务技术--Nacos与Eureka

eureka注册中心 远程调用的问题 消费者该如何获取服务提供者具体信息? 服务提供者启动时向eureka注册自己的信息eureka保存这些信息消费者根据服务名称向eureka拉取提供者信息 如果有多个服务提供者,消费者该如何选择? 服务消费者利用负载均…

区块链技术1---密码学基础

摘要:BTC属于加密货币,其中必然涉及到密码学的知识,而比特币比较开放,交易记录,交易金额甚至是底层源代码都是对外开放,那么加密使用在何处?这里就来谈一谈1:哈希哈希函数是密码学的…

client-go实战之六:时隔两年,刷新版本继续实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一:准备工作client-go实战之二:RESTClientclient-go实战之三:Clientsetclient-go实战之四:…

JavaWeb开发(三)3.3——Spring Bean详解

一、Bean的概念 由 Spring IoC 容器负责创建、管理所有的Java对象&#xff0c;这些管理的对象称为 Bean&#xff0c;Bean 根据 Spring 配置文件中的信息创建。 二、基于XML方式管理bean对象 eg&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

【B-树、B+树、B* 树】多叉平衡搜索树,解决“IO次数”与“树高”问题~

目录 一、为什么会出现B-树&#xff1f; 面试题&#xff1a; 二、什么是B-树&#xff1f; 2.1、B,B-树,B*树 导航 三、B-树的模拟实现 3.1、插入结点分析 3.1.1、根节点的分裂 3.1.2、继续插入数据&#xff0c;分裂子节点 3.2.3、再次插入数据&#xff0c;导致根节点继…

tomcat和apache有什么区别?如何将内网发布到互联网访问?

tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的&#xff0c;我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联…

Android原生检测Selinux的三种方法

本文介绍 3 种检测 Android 设备 SELinux 状态的方法, Java 层检测Selinux已经没有太多意义,因为不是很靠谱,随便一个hook代码就能绕过,所以我要告诉你如何在 C 层完成检测。这几种方法在效率和抵抗mock SELinux State 的技术方面都不相同,因此在使用之前你需要知道每种方…

Windows server——部署DNS服务

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.DNS概述 1.DNS的诞生 二.DNS的功能 使用域名访问具有以下优点…

【大厂高频真题100题】《二叉树的序列化与反序列化》 真题练习第23题 持续更新~

二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限…

c语言 图形化贪吃蛇 多种功能 无需安装第三方库 课设 (附代码)

前言 类贪吃蛇是利用c语言模仿并实现经典游戏贪吃蛇&#xff0c;使其在窗口有贪吃蛇活动的规定范围&#xff0c;并完成一系列包括但不限于模仿蛇的移动&#xff0c;方向控制&#xff0c;吃到食物加分&#xff0c;撞上墙壁及蛇头碰到蛇身死亡等游戏功能。 附加功能&#xff1a…

软件测试复习03:动态测试——白盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录逻辑覆盖法&#xff1a;最常用程序插桩技术基本路径法点覆盖边覆盖边对覆盖主路径覆盖符号测试错误…

前端leaflet框选下载bing遥感图

微软必应bing遥感图。bing地图比百度遥感图清晰很多&#xff0c;19级&#xff0c;百度是18级&#xff0c;同样的18级&#xff0c;bing地图比百度也清晰很多。所以没有必要用百度地图了。不过bing地图仅用于学习&#xff0c;商用要付费。参考了https://xiaozhuanlan.com/topic/6…

CV+Deep Learning——网络架构Pytorch复现系列——Detection(二:RtinaNet)更换backbones

上一话 CVDeep Learning——网络架构Pytorch复现系列——Detection(一&#xff1a;SSD:Single Shot MultiBox Detector 4.推理Detect)https://blog.csdn.net/XiaoyYidiaodiao/article/details/128683973?spm1001.2014.3001.5501 复现Object Detection&#xff0c;会复现的网络…