C语言实现动态数组

1.mj版本的动态数组

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define DEFAULT_CAPACITY 10
#define ELEMENT_NOT_FOUND -1
// 定义全局变量 
// 数组元素个数
int size = 0;
// 初始化动态数组
int* initArray(int capacity) {// 如果我自行提供了数组的容量 那么我就根据指定的参数容量来创建数组capacity = capacity > DEFAULT_CAPACITY ? capacity : DEFAULT_CAPACITY;int* array = (int*)(malloc(sizeof(int) * capacity));return array;
}
// 对数组进行扩容操作的方法
void ensureCapacity(int size, int* array) {// 首先获取旧数组的容量int oldCapacity = sizeof(array) / sizeof(array[0]);if (size <= oldCapacity)return;// 如果需要执行扩容操作的话 那么首先设置新数组的容量int newCapacity = oldCapacity + (oldCapacity >> 1);int* newArray = (int*)(malloc(sizeof(int) * newCapacity));// 将旧数组的所有元素统统拷贝到新数组中for (int i = 0; i < newCapacity; ++i) {newArray[i] = array[i];}// 然后让旧数组指向新数组array = newArray;
}
// 索引越界方法
void outOfBounds(int index) {printf("索引为%d 索引越界了", index);
}
// 边界检查
void rangeCheck(int index){if (index < 0 || index >= size)outOfBounds(index);
}
// 针对添加方法的边界检查
void rangeCheckForAdd(int index) {if (index < 0 || index > size)outOfBounds(index);
}
// 往动态数组的指定位置进行添加操作
void add(int index, int data, int* array) {// 首先对参数索引进行边界检查rangeCheckForAdd(index);// 接着判断是否需要进行扩容操作ensureCapacity(size + 1, array);// 由于待插入元素之后的所有元素都要从前往后移动 所以遍历的时候就从后往前进行遍历for (int i = size; i > index; i--) {array[i] = array[i - 1];}// 然后将待插入元素放置在指定位置处array[index] = data;// 更新动态数组的长度size++;
}
// 对动态数组进行删除操作
int delete(int index, int* array) {// 首先对参数索引进行边界检查rangeCheck(index);// 然后定义一个变量 用于保存待删除的元素int delete = array[index];// 由于需要将待删除元素后面所有的元素从后往前移动 所以说遍历的时候就从前往后进行遍历操作for (int i = index; i < size - 1; i++) {array[i] = array[i + 1];}// 更新动态数组长度size--;// 返回被删除的元素return delete;
}
// 获取指定元素的位置
int indexOf(int data, int* array) {for (int i = 0; i < size; ++i) {if (array[i] == data)return i;}// 如果循环过程中始终没有返回值的话 那么说明数组中不存在指定元素return ELEMENT_NOT_FOUND;
}
// 获取指定位置处的元素
int get(int index, int* array) {rangeCheck(index);return array[index];
}
// 重置指定位置处的元素
int set(int index, int newData, int* array) {rangeCheck(index);int data = array[index];array[index] = newData;return data;
}
// 清空元素
void clear(int* array) {free(array);size = 0;
}
// 判断指定数组中是否包含指定元素
bool contains(int data, int* array) {return indexOf(data, array) != ELEMENT_NOT_FOUND;
}
// 判断数组是否为空
bool isEmpty() {return size == 0;
}
// 获取数组长度
int getSize() {return size;
}
// 打印数组
void printArray(int* array) {for (int i = 0; i < size; ++i) {printf("%d ", array[i]);}printf("\n");
}
// 定义一个主函数
int main() {// 创建一个动态数组int* array = initArray(8);// 对数组进行添加操作add(0, 1, array);// 1add(0, 2, array);// 2 1add(0, 3, array);// 3 2 1printArray(array);// 3 2 1printf("%d\n", get(0, array));// 3printf("%d\n", set(0, 4, array));// 3printArray(array);// 4 2 1printf("%d\n", getSize());// 3delete(0, array);printArray(array);// 2 1printf("%d\n", isEmpty());// 0printf("%d\n", contains(2, array));// 1clear(array);printf("%d\n", getSize());// 0
}

测试可以通过 代码经得住考验

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

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

相关文章

es5和es6的区别

ES5 和 ES6 的区别 ECMAScript5&#xff0c;即 ES5&#xff0c;是 ECMAScript 的第五次修订&#xff0c;于 2009 年完成标准化 ECMAScript6&#xff0c;即 ES6&#xff0c;是 ECMAScript 的第六次修订&#xff0c;于 2015 年完成&#xff0c;也称 ES2015 ES6 是继 ES5 之后的一…

SpringBoot 入门教程

1.复习SSM项目中&#xff0c;用spring&#xff0c;mybatis,springmvc这三个框架整合的项目。 SSM项目的所有类&#xff0c;这是用SSM整合一个搜索书籍种类和呈现的前端和后端的ssm的小项目。 2.springboot如何去开发这个页面&#xff1a; 新建springboot项目&#xff0c;勾选对…

<软考高项备考>《论文专题 - 68 质量管理(7) 》

7 管理关系论文解析 7.1 项目质量与进度、成本、范围之间的密切关系。&#xff08;2018年上&#xff09; 在项目管理三角形中&#xff0c;质量位于进度&#xff0c;成本&#xff0c;范围的中间的位置。 规划质量管理的输入中有需求文件&#xff0c;也就是说先有范围有需求的基…

MeshLab生成分形地形

文章目录 分型地形脊状多重分形其他地形 分型地形 分形地形是一种较为复杂的几何对象&#xff0c;MeshLab提供了下列五种地形生成算法&#xff0c;并且贴心地给出了每种算法相对较好的参数。 算法SeedOctaves缺项性分形增量偏移增益fBM(fractal Brownian Motion)11021.2--Sta…

【WPF.NET开发】WPF中的版式

本文内容 改进的文本质量和性能丰富的版式增强的国际文本支持增强的字体支持新的文本应用程序编程接口 (API) 本主题介绍 WPF 的主要版式功能。 这些功能包括改进的文本呈现质量和性能、OpenType 版式支持、增强的国际文本、增强的字体支持和新的文本应用程序编程接口 (API)。…

VUE好看的个人博客源码

文章目录 1.设计来源1.1 首页界面1.2 我的日记界面1.3 我的文章界面1.3.1 文章列表1.3.2 文章时间轴1.3.3 文章详细 1.4 我的相册界面1.5 我的源码界面1.6 认识我界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https:/…

从头安装与使用一个docker GPU环境

GPU版docker的安装与使用 欢迎使用GPU版docker安装使用说明使用官方教程安装docker新建一个GPU版docker环境调用docker环境执行本地python文件 欢迎使用GPU版docker安装使用说明 使用官方教程安装docker 导入源仓库的GPG key curl -fsSL https://download.docker.com/linux/…

【计算机组成原理】期末复习试卷

目录 第一套试卷 第一套答案 第二套试卷 第二套答案 第三套试卷 第四套试卷 剩余试卷下载 第一套试卷 一、选择题&#xff08;共20分&#xff0c;每题1分&#xff09; 1&#xff0e;冯诺伊曼机工作方式的基本特点是______。 A&#xff0e;多指令流单数据流&#xff1b; B&#…

C++八股2

虚拟内存 虚拟内存是计算机系统内存管理的一种技术&#xff0c;它为每个进程提供一个独立的、连续的地址空间&#xff0c;即使物理内存有限或不连续。在C编程中&#xff0c;操作系统通过页表将虚拟地址映射到物理内存地址上。当程序试图访问不在物理内存中的虚拟地址时&#xf…

03MARL-联合策略与期望回报

文章目录 前言一、MARL问题组成二、联合策略与期望回报1.History-based expected return2.Recursive expected return 前言 多智能体强化学习问题中的博弈论知识——联合策略与期望回报 一、MARL问题组成 二、联合策略与期望回报 定义一种普遍的期望回报&#xff0c;能够用于…

任务8:安装大数据统计分析工具Hive

任务描述 知识点&#xff1a;Hive安装应用 重 点&#xff1a; 基于CentOS系统&#xff0c;安装配置Hive创建访问Hive数据库的用户&#xff0c;并授予访问权限 内 容&#xff1a; 安装Hive配置MySQL、设置远程访问权限配置HiveHive服务端、客户端访问 任务指导 1. Hive…

多线程——阻塞队列

什么是阻塞队列 相比于一般的队列&#xff0c;有两个特点 1.线程安全 2.带有阻塞功能 1&#xff09;队伍为空时&#xff0c;出队列就会出现阻塞&#xff0c;阻塞到其他线程入队列为止 2&#xff09;队伍为满时&#xff0c;入队列就会出现阻塞&#xff0c;阻塞到其他线程出队列…

中国移动宽带复机短信代码

发送”SQKDFJ“到10086、然后在10分钟之内&#xff0c;会收到另外一个号码发来的确认短信&#xff0c;回复”是“即可。

九州金榜|15岁初三男孩抑郁休学摆烂打游戏,高压教育要不得!

有一次和朋友一块聚餐&#xff0c;邻座是一位妈妈、和她大概七八岁的儿子&#xff0c;小男孩长得很帅气&#xff0c;没有像同龄人那样调皮捣乱&#xff0c;而是和妈妈很温馨的就餐。 看的出来一家人的素质很高&#xff0c;就餐过程中桌面保持的很整洁&#xff0c;交流声音也不…

你和家酿啤酒的距离,只差一台爱咕噜智能啤酒机

喝过工业啤酒&#xff0c;喝过精酿啤酒&#xff0c;但是你喝过在家自酿的啤酒吗&#xff1f; 啤酒是世界上消耗较多的饮料之一&#xff0c;而我国的啤酒年消耗量位居世界第一。近年来&#xff0c;随着越来越多的精酿啤酒涌入市场&#xff0c;精酿啤酒的概念与文化被更多消费者…

揭秘小米手机被疯狂吐槽的存储扩容技术

前段时间&#xff0c;在小米14的发布会上&#xff0c;雷布斯公布了名为“Xiaomi Ultra Space存储扩容”的技术&#xff0c;号称可以在512G的手机中再搞出来16G&#xff0c;256G的手机中再搞出8G。对于普通用户来说&#xff0c;能多得一些存储空间&#xff0c;无异是个很好的福利…

PID横向控制和仿真实现

文章目录 1. PID介绍2. PID横向控制原理3. 算法和仿真实现 1. PID介绍 PID是一种常见的控制算法&#xff0c;全称为Proportional-Integral-Derivative&#xff0c;即比例-积分-微分控制器。PID控制器是一种线性控制器&#xff0c;它将设定值与实际值进行比较&#xff0c;根据误…

Python轴承故障诊断 (11)基于VMD+CNN-BiGRU-Attenion的故障分类

目录 往期精彩内容&#xff1a; 前言 模型整体结构 1 变分模态分解VMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障VMD分解可视化 2.3 故障数据的VMD分解预处理 3 基于VMD-CNN-BiGRU-Attenion的轴承故障诊断分类 3.1 定义VMD-CNN-BiGRU-Attenion分类网…

【C#】当重复使用一段代码倒计时时,使用静态类和静态方法,实现简单的this扩展方法

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

多特征变量序列预测(三)——CNN-Transformer风速预测模型

目录 往期精彩内容&#xff1a; 前言 1 多特征变量数据集制作与预处理 1.1 导入数据 1.2 数据集制作与预处理 2 基于Pytorch的CNN-Transformer 预测模型 2.1 定义CNN-Transformer预测模型 2.2 设置参数&#xff0c;训练模型 3 模型评估与可视化 3.1 结果可视化 3.2 …