【C语言】通讯录的动态存储版本

2023-11-08

目录

一.前言

二.为什么要动态存储?

1.动态存储的作用:

2动态与静态存储的区别:

三.动态存储的实现

1.通讯录容量

2.初始化通讯录

3.增加/减少通讯录成员

增加通讯录成员

判断及实现扩容函数的实现

减少通讯录成员

判断及实现减容函数的实现

4.重置通讯录

5.退出通讯录

 四.结语


一.前言

本文在前文通讯录源码(链接:https://blog.csdn.net/qq_74641564/article/details/128741939)的基础上进行优化,以实现通讯录成员的动态存储。

二.为什么要动态存储?

1.动态存储的作用:

动态存储能实现对内存资源更合理的分配与使用

2动态与静态存储的区别:

静态版本中的数据没有动态版本方便灵活的分配内存。

拿静态通讯录来举例的话就很显而易见,假如一个静态通讯录需要存储100个人甚至1000个人的信息,那么提前创建的这些人的数据加起来将会极大的占据内存空间,甚至溢出,然而,如果有几个人就存几个人的数据,那么不就可以避免对内存浪费的情况了吗?

三.动态存储的实现

1.通讯录容量

将原来的成员结构体数组删除,取而代之的是成员结构体指针,同时需要创建一个新的变量来表示每次扩容减容的数量。

typedef struct Contact
{
	ContactMember* data;
	int sz;
	int capacity;
}Contact;

2.初始化通讯录

使用calloc函数申请了一定数量的成员结构体大小的空间,此处创建ptr以防返回NULL指针。

//初始化成员信息
//DEFAULT_SIZE定义为常量
void InitContact(Contact* con)
{
	assert(con);
	con->sz = 0;

    //申请空间
	ContactMember* ptr = (ContactMember*)calloc(DEFAULT_SIZE , sizeof(ContactMember));
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	con->data = ptr;

	con->capacity = DEFAULT_SIZE;
}

3.增加/减少通讯录成员

增加通讯录成员

如果前面所申请的空间被使用完的话,那么就需要对原本申请的空间扩容,以此来存放更多的成员数据,因此在增加通讯录成员前对当前容量进行判断是否需要扩容。

void AddContact(Contact* con)
{
	assert(con);

    //检查扩容
	check_capacity(con);

	printf("请输入姓名:");
	scanf("%s", con->data[con->sz].Name);
	printf("请输入性别:");
	scanf("%s", con->data[con->sz].Sex);
	printf("请输入年龄:");
	scanf("%d", &con->data[con->sz].Age);
	printf("请输入住址:");
	scanf("%s", con->data[con->sz].Address);
	printf("请输入号码:");
	scanf("%s", con->data[con->sz].Number);
	printf("输入完毕!\n");

	con->sz++;
}

判断及实现扩容函数的实现

使用realloc函数对原本的容量扩大,同样,也要对返回的指针进行判断。要是直接返回NULL指针可就要出大问题呢...

//检查增容
void check_capacity(Contact* con)
{
	if (con->sz == con->capacity)
	{
		ContactMember* ptr = (ContactMember*)realloc(con->data, (con->capacity + Capacity) * sizeof(ContactMember));
		if (ptr == NULL)
		{
			perror("check_capacity::realloc");
			return;
		}
		con->data = ptr;
		con->capacity += Capacity;
		printf("扩容成功!\n");
	}
}

减少通讯录成员

与增加相似,但需要在减少成员之后再嵌套判断函数。

void DelContact(Contact* con)
{
	assert(con);

	if (con->sz == 0)
	{
		printf("没有可以删除的目标!\n");
		return;
	}

	printf("请输入目标删除人:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindName(con, name);
	if (ret == -1)
	{
		printf("目标人物不存在!\n");
		return;
	}
	memmove(con->data + ret, con->data + ret + 1, sizeof(con->data[0]) * (con->sz - ret - 1));
	printf("删除成功!\n");
	con->sz--;

    //判断减容
	check_del_capacity(con);
}

判断及实现减容函数的实现

与增容函数一样,改变的只有加减号。

//检查减容
void check_del_capacity(Contact* con)
{
	if (con->sz <= con->capacity - Capacity && con->capacity >= DEFAULT_SIZE)
	{
		ContactMember* ptr = (ContactMember*)realloc(con->data, (con->capacity - Capacity) * sizeof(ContactMember));
		if (ptr == NULL)
		{
			perror("check_del_capacity::realloc");
			return;
		}
		con->data = ptr;
		con->capacity -= Capacity;
		printf("减容成功!\n");
	}
}

4.重置通讯录

俗话说,东西有借有还,既然前面申请了一定的空间,那么不需要用的时候就要还回去。重置的时候就要把前面申请的内存都给free(释放)掉,再重新申请原本大小的空间。当然,realloc函数也可以实现,任君选择。

void EmptyContact(Contact* con)
{
	assert(con);

	//释放前者内存
	free(con->data);
	con->data = NULL;

    //重置
	con->sz = 0;
	ContactMember* ptr = (ContactMember*)calloc(DEFAULT_SIZE, sizeof(ContactMember));
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	con->data = ptr;
	con->capacity = DEFAULT_SIZE;

	printf("重置成功!\n");
}

5.退出通讯录

退出通讯录不能使用重置通讯录的函数,因为这会再申请一块空间,我们只需要将内存还回去就行了。

//退出通讯录
void DestoryContact(Contact* con)
{
	con->capacity = 0;
	con->sz = 0;
	free(con->data);
	con->data = NULL;
	con = NULL;
}

 四.结语

最后大家别忘了把修改的数据替换哦,让我们一起努力学习向心仪的offer进发把!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言】通讯录的动态存储版本 的相关文章

  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 软件测试|使用Python读写yaml文件,你会了吗?

    简介 YAML YAML Ain t Markup Language 是一种可读的数据序列化格式 它常用于配置文件和数据交换 Python 提供了许多库来处理 YAML 文件 在本文中 我们将探讨如何使用 PyYAML 库来读取和写入 YA
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看 但是自己又没有好的资源可以进行替换 突然我一个朋友提醒了我 网络上的图片这么多 你甚至可以每天换很多个好看的背景 但是如果让我手动去设置的话 我觉得太麻烦了 我不如使用技术手段将图片下
  • 【计算机毕业设计】电影院订票信息管理系统

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统电影院订票采取了人工的管理方法 但这种管理方法存在着许多弊
  • 【计算机毕业设计】白优校园社团网站的设计与实现

    近些年 随着中国经济发展 人民的生活质量逐渐提高 对网络的依赖性越来越高 通过网络处理的事务越来越多 随着白优校园社团网站的常态化 如果依然采用传统的管理方式 将会为工作人员带来庞大的工作量 这将是一个巨大考验 需要投入大量人力开展对社团
  • 【硕士论文复现】可再生能源发电与电动汽车的协同调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 上层问题 1 2 下层问题 2 运行结果
  • 华为OD机试2024年最新题库(Java)

    我是一名软件开发培训机构老师 我的学生已经有上百人通过了华为OD机试 学生们每次考完试 会把题目拿出来一起交流分享 重要 2024年1月 5月 考的都是OD统一考试 C卷 题库已经整理好了 命中率95 以上 这个专栏使用 Java 解法 问
  • 计算机Java项目|尤文图斯足球俱乐部网上商城系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • Python 文件的复制重命名以及xlsx文件中表格分开保存

    1 需要的头文件 import shutil import os import openpyxl 2 复制文件以及重命名 直接使用shutil库复制 重命名 移动即可 函数封装示例 source path 为全局变量被复制文件路径 dest
  • 计算机Java项目|学生成绩管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 计算机Java项目|基于SpringBoot个人空间平台的设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 2024史上最全Java面试八股文(带全部答案)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 【卡尔曼滤波】具有梯度流的一类系统的扩散映射卡尔曼滤波器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 15天学会Python深度学习,我是如何办到的?

    陆陆续续有同学向我们咨询 Python编程如何上手 深度学习怎么学习 如果有人能手把手 一对一帮帮我就好了 我们非常理解初学者的茫然和困惑 大量视频 书籍 广告干扰了大家的判断 学习Python和人工智能 成为内行人不难 为此 我们推出了
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使
  • 【路径规划】基于改进遗传算法求解机器人栅格地图路径规划(Matlab实现实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 2024年华为OD机试真题-分割均衡字符串-Python-OD统一考试(C卷)

    题目描述 均衡串定义 字符串只包含两种字符 且两种字符的个数相同 给定一个均衡字符串 请给出可分割成新的均衡子串的最大个数 约定字符串中只包含大写的 X 和 Y 两种字符 输入描述 均衡串 XXYYXY 字符串的长度 2 10000 给定的
  • 计算机Java项目|有机蔬菜商城

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 【C#】基础巩固

    最近写代码的时候各种灵感勃发 有了灵感 就该实现了 可是 实现起来有些不流畅 总是有这样 那样的卡壳 总结下来发现了几个问题 1 C 基础内容不是特别牢靠 理解的不到位 导致自己想出来了一些内容 但是无法使用正确的C 代码实现 导致灵感无法
  • 计算机Java项目|java游戏账号交易系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板

随机推荐

  • 华为OD机试真题- 非严格递增连续数字序列-2023年OD统一考试(B卷)

    题目描述 输入一个字符串仅包含大小写字母和数字 求字符串中包含的最长的非严格递增连续数字序列的长度 比如12234属于非严格递增连续数字序列 输入描述 输入一个字符串仅包含大小写字母和数字 输入的字符串最大不超过255个字符 输出描述 最长
  • 305_启动服务防止app劫持

    启动服务防止app劫持 app劫持就是某个应用来监测我们的app的动态 当我们比如启动了某个需要输入密码的界面比如登录 支付这种敏感界面 这个流氓应用就启动一个activity来覆盖我们的activity 这样我们就可能把密码输入到流氓应用
  • Node 正常启动(node)、热更启动(nodemon)、部署(pm2)、安装包(npm、cnpm、yarn)、发布包(publish) 、node版本管理(NVM) 常用工具----学习笔记(五)

    文章目录 1 Node服务启动指令的配制 2 nodemon Node监听文件变化 自动重启服务的方法 3 pm2 线上部署使用pm2能自动守护进程 4 cnpm yarn 安装包 是使用npm cnpm yarn 5 注册与发布包 6 n
  • mysql主从配置文件

    主节点配置文件 Copyright c 2017 Oracle and or its affiliates All rights reserved This program is free software you can redistri
  • APK 反编译过程中的几个错误解决方法

    今天在反编译研究个apk的时候在回编译的时候提示如下错误 一 All register args must fit in 4 bits 提示出错的行数的代码是 pre class java invoke virtual v0 p0 v1 L
  • 2021-1-29Linux学习纪要

    删除用户 userdel 用户名 会保留主目录 userdel r 用户名 全部删完 在实际开发中会保留家目录 查询用户信息 id 用户名 当用户不存在 返回 无此用户 切换用户 基本语法 su 切换用户名 创建一个普通用户 指定密码 su
  • docker部署jenkins-slave分布式节点

    docker 运行jenkins slave示例 使用jnlp方式进行连接 即是agent主动连接master docker run jenkins jnlp slave url http jenkins server port workD
  • 计算机组成原理fc和fz,合肥工业大学计算机组成原理实验报告(DOC)

    合肥工业大学计算机组成原理实验报告 DOC 合肥工业大学计算机组成原理 合肥工业大学计算机组成原理试卷 计算机组成原理实验pdf 计算机组成原理微程序 计算机组成原理实验报告 计算机组成原理知识点 计算机组成原理试卷 计算机组成原理 pdf
  • apache出现You don't have permission to access / on this server. 提示

    看看是不是DocumentRoot的值改过了 如果是的话还要再看
  • 【单目标优化算法】孔雀优化算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及详细文章 1 概述 受孔雀群智能行为的启发 POA的设计
  • 数据科学中的数据库简介

    推荐 使用 NSDT场景编辑器 快速搭建3D应用场景 用于高效视频 AI 和图形的通用加速器 数据科学中的数据库简介 数据科学涉及从大量数据中提取价值和见解 以推动业务决策 它还涉及使用历史数据构建预测模型 数据库有助于对如此大量的数据进行
  • 云原生之使用Docker部署wordpress网站

    云原生之使用Docker部署wordpress网站 一 wordpress介绍 二 检查本地docker环境 1 检查docker状态 2 检查docker版本 三 下载wordpress镜像 四 创建数据库 1 创建数据目录 2 创建my
  • 免费AWS EC2实例

    免费日期 2022年12 月 31日前 免费类型 Amazon Linux 2 AMI HVM SSD Volume Type 64 位 ARM 只支持ARM t4g micro 其他平台可用 例如 Ubuntu 18 04 或更新版本 R
  • FreeRTOS临界区

    FreeRTOS临界区是指那些必须完整运行 不能被打断的代码段 比如有的外设的初始化需要严格的时序 初始化过程中不能被打断 FreeRTOS 在进入临界区代码的时候需要关闭中断 当处理完临界区代码以后再打开中断 FreeRTOS 系统本身就
  • 引入springcloud报错。common依赖找不到_引用fabric-sdk和fabric报错 go mod 调试记录

    1 背景介绍 在fabric中 我们将proto定义文件放到fabric protos common路径下 在fabric sdk go中 我们引入的是fabric protos go包 当同时引入的时候 会将相同名称的proto对象注册
  • Swagger怎么做免鉴权

    前言 Swagger在API文档生成及测试方面非常方便 但是很多的API调用都需要用到token验证 然后经过Gateway网关 鉴权验证通过之后访问业务系统 为了方便后端开发自测接口 我们可以免去鉴权吗 答案是可以的 一般鉴权方式 我们先
  • 页面性能优化,如何减少回流

    在开发时 不可避免的会遇到性能优化的问题 怎么做性能才会更好 说到页面性能优化 我们就谈谈两个概念重绘和回流 1 什么是重绘 什么是回流 重绘 当渲染树中的一些元素需要更新属性 而这些属性只是影响元素的外观 风格 而不会影响布局的操作 比如
  • windows搭建WEB打印机

    文章目录 Web Print 添加一台虚拟打印机 名称为 CS Print 发布到AD域 客户端们都能够通过访问 https print www chinaskills com 查看打印机 证书由CSK2021 ROOTCA进行签署颁发 1
  • skywalking和jpa冲突

    1 报错 org springframework security authentication InternalAuthenticationServiceException No MethodInvocation found Check
  • 【C语言】通讯录的动态存储版本

    目录 一 前言 二 为什么要动态存储 1 动态存储的作用 2动态与静态存储的区别 三 动态存储的实现 1 通讯录容量 2 初始化通讯录 3 增加 减少通讯录成员 增加通讯录成员 判断及实现扩容函数的实现 减少通讯录成员 判断及实现减容函数的