用C语言实现动态数组Vector

代码仓库地址

1. 动态数组原理

定义一个结构体类型,在结构体中用指针指向一个在堆空间开辟的一块内存。

在这里插入图片描述

2. 编写头文件

在头文件里定义Vector的数据结构和相关操作,可以通过修改 “typedef char* Element;” 来修改存储的数据的类型;

#ifndef VECTOR_H
#define VECTOR_H// 数组默认容量设置为10
#define DEFAULT_CAPACITY 10 
// 数组长度低于 HIGHT_SIZE 时,每次按照原长度翻倍扩容
// 数组长度高于 HIGHT_SIZE 时,扩充原容量的1/2
#define HIGHT_SIZE 1000 // 定义存储的数据类型
typedef char* Element;// 定义Vector的数据结构
typedef struct vector_s {Element *data; // 用于存储数据的动态数组的指针int size; // 数组长度int capacity; // 容量
} Vector;// 创建一个空的Vector
Vector* vector_create();// 销毁释放Vector
void vector_destroy(Vector *v);// 向动态数组的末尾新增一个元素
void vector_push_back(Vector *v, Element val);// 向数组的前面插入一个元素
void vector_push_front(Vector *v, Element val);// 将元素val添加到索引为idx的位置,idx后面的元素依次后移
void vector_insert(Vector *v, int idx, Element val);// 给Vector的动态数组扩容
static void vector_rsize(Vector *v);// 将数组的元素从指定下标位置依次向后挪动
static void move_data(Vector *v, int idx);#endif
3. 具体实现

1. 创建一个空的Vector

Vector* vector_create() {Vector *v = (Vector*)calloc(1, sizeof(Vector));if (v == NULL) {puts("error:创建一个空的Vector时分配内存失败");exit(-1);}// 给Vector的成员变量赋值v->data = c1alloc(DEFAULT_CAPACITY, sizeof(Element));if (v->data == NULL) {puts("error:创建一个空的Vector时分配内存失败");free(v); // 因为下面一行是直接退出程序,free(v)意义不大,但最好还是写上,养成习惯exit(-1);}v->capacity = DEFAULT_CAPACITY;return v;
}

2. 销毁释放Vector

void vector_destroy(Vector *v) {if (v == NULL) { // Vector不能是NULLreturn;}free(v->data);free(v);
}

3. 向动态数组的末尾新增一个元素

void vector_push_back(Vector *v, Element val) {if (v == NULL) { // Vector不能是NULLreturn;}if (v->size == v->capacity) { // 容量不足,扩容vector_rsize(v);}v->data[v->size] = val;v->size++;
}

4. 向数组的前面插入一个元素

void vector_push_front(Vector *v, Element val) {if (v == NULL) { // Vector不能是NULLreturn;}if (v->size == v->capacity) { // 容量不足,扩容vector_rsize(v);}// 从下标0向后移动并在0下标位置赋值move_data(v, 0);v->data[0] = val;v->size++;
}

5. 将元素val添加到索引为idx的位置,idx后面的元素依次后移

void vector_insert(Vector *v, int idx, Element val) {if (v == NULL || idx < 0 || idx > v->size) { // Vector不能是NULL,索引位置不能为负且不能越界return;}if (v->size == v->capacity) { // 容量不足,扩容vector_rsize(v);}move_data(v, idx);v->data[idx] = val;v->size++;
}

6. 给Vector的动态数组扩容

tips:此函数以下几点需要注意

  1. 算术运算‘+’的优先级比位运算符‘>>’高,要用括号括起来;
  2. 用realloc扩容,不能用calloc和malloc来扩大容量,数据会丢失;
  3. 扩容的时候要注意是给Vector的data数组扩容,即v->data;
  4. 只有calloc会默认自动赋初值,malloc和realloc都不会默认赋初值,记得给扩容部分附上初始值;
static void vector_rsize(Vector *v) {int old_capacity = v->capacity;// tips:算术运算‘+’的优先级比位运算符‘>>’高,要用括号括起来int new_capacity = v->size < HIGHT_SIZE ? old_capacity << 1 : old_capacity + (old_capacity >> 1);// tips:用realloc扩容,不能用calloc和malloc,数据会丢失!// tips:扩容的是v->data,而不是vElement *temp = realloc(v->data, new_capacity * sizeof(Element));if (temp == NULL) {puts("error:给Vector的动态数组扩容失败");exit(-1);}// tips:v->data扩容部分附上初值memset(v->data + v->size, 0, (v->capacity - v->size) * sizeof(Element));v->data = temp;v->capacity = new_capacity;
}

7. 将数组的元素从指定下标 idx 位置依次向后挪动1个位置

static void move_data(Vector *v, int idx) {for (int i = v->size - 1; i >= idx; i--) {v->data[i+1] = v->data[i];}v->data[idx] = 0;
}

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

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

相关文章

python代码 重命名指定目录下 文件夹 or 文件

代码十几秒的事,为什么要手动去改一天呢!直接放源码~ 重命名指定目录下所有文件夹 import os import redef extract_first_three_numbers_from_folder_name(folder_name):numbers = re.findall(r\d+, folder_name)return numbers[:3]def rename_folders_with_prefixes(dire…

歌手荆涛演唱的春节回家:传统与现代的交织,歌声里的乡愁与期盼

随着冬日渐寒&#xff0c;春节的脚步愈发临近。这是一个充满温馨与期待的时刻&#xff0c;一个穿越时空、凝聚亿万华夏儿女情感的盛大节日。春节&#xff0c;它不仅仅是一个传统习俗的展现&#xff0c;更是一种心灵的归宿&#xff0c;一种文化的传承。 在悠久的历史长河中&…

Selenium 学习(0.18)——软件测试之基本路径测试

1、基本路径法测试的概念 是一种白盒测试方法&#xff0c;它在程序控制流图的基础上&#xff0c;通过分析控制构造的环行复杂性&#xff0c;导出基本可执行路径集合&#xff0c;从而设计测试用例的方法。 要保证在测试中程序的每一个可执行语句至少执行一次 【这和语句…

很有用!小企业如何从零开始制作产品手册?

对于初创公司和小企业来说&#xff0c;创造一份高效、吸引人的产品手册可能不是特别简单&#xff0c;特别是当资源和预算有限的时候。然而&#xff0c;一份良好的产品手册可以帮助你传达你的品牌故事&#xff0c;展示你的产品&#xff0c;甚至可以帮助你提高销售额&#xff0c;…

泛型编程-常用模板

例举C11 常用模板 一.变参模板 当我们需要处理不定数量的参数时&#xff0c;C的变参模板&#xff08;variadic templates&#xff09;提供了一种灵活的解决方案。变参模板允许我们定义接受任意数量参数的函数或类模板。 变参模板主要分为三部分&#xff1a; 模板形参包&#x…

Transformers 2023年度回顾 :从BERT到GPT4

人工智能已成为近年来最受关注的话题之一&#xff0c;由于神经网络的发展&#xff0c;曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成&#xff0c;人工智能正在改变我们与技术互动的方式。特别是机器学习 (ML) 模型在自然语言处理 (NLP) 领域取得…

【仙丹秘法】如何炼制一颗稳定的仙丹

提示词始终保持不变 1&#xff1a;收集素材 制作lora_v1 2: 制作lora_v1 产生 1个人物 含 你想要的服装 导入 pose_1 到 control 1 生成人物 (white_background:1.1),front view,1boy,blue sleeveless t-shirt,blue shorts,detailed eyes,best quality,masterpiece,high res…

第三站:C/C++基础-二维数组

二维数组的概念 一维数组本身是多个大小相同的内存块,从0开始逐渐递增所组成的在横向上的有序"组合", 二维数组就是很多个一维数组在纵向上的组合,每一个一维数组就是二维数组在纵向上的从0开始的逐渐递增的一个单位,(所以一维数组在二维数组的基础上,每一个内存块…

L1-010 比较大小(Java)

题目 本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中将3个整数从小到大输出&#xff0c;其间以“->”相连。输入样例: 4 2 8 输出样例: 2->4->8解题思路 输入三个整数&#xff1a;…

Spring 基于注解的AOP见解4

5.基于注解的AOP配置 5.1创建工程 5.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

SUDA-计算机网路-期末复习提纲

写在前面 帮苏大的同学整理的计网复习材料&#xff0c;用的是他们老师划定的范围。 1.负责互联网协议开发、标准制定、地址分配的国际组织名称及其主要职责 (1) 地址支持组织&#xff08;ASO&#xff09;负责IP地址系统的管理。 (2) 域名支持组织&#xff08;DNSO&#xff09;…

LeetCode(242)有效的字母异位词⭐

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输…

更新 torchtext 造成的torch版本不匹配的问题

更新 torchtext 造成的torch版本不匹配的问题 - pip 原来的版本配置 cuda11.6 torch-GPU 1.13.1 如果直接pip update torchtext 会卸载原来的torch然后默认安装CPU版本&#xff0c;很烦。网上的各种方法都是推荐conda.但是我一直都是pip。因此考虑pip 的解决办法。 解决办…

【2023 CSIG垂直领域大模型】大模型时代,如何完成IDP智能文档处理领域的OCR大一统?

目录 一、像素级OCR统一模型&#xff1a;UPOCR1.1、为什么提出UPOCR&#xff1f;1.2、UPOCR是什么?1.2.1、Unified Paradigm 统一范式1.2.2、Unified Architecture统一架构1.2.3、Unified Training Strategy 统一训练策略 1.3、UPOCR效果如何&#xff1f; 二、OCR大一统模型前…

kdump安装及调试策略

本文基于redhat系的操作系统&#xff0c;debian系不太一样&#xff0c;仅提供参考 1.kdump的部署 注&#xff1a;一般很多操作系统在安装时可默认启动kdump。 &#xff08;1&#xff09;需要的包 yum install kexec-tools crash kernel-debuginfo &#xff08;2&#xff0…

《堆排序》与《Top—k》

目录 ​编辑 前言&#xff1a; 关于《堆排序》&#xff1a; 第一步&#xff1a;建堆 第二步&#xff1a;排序 《Top—K问题》 关于Top—k问题&#xff1a; 前言&#xff1a; 我们在前面的blog中&#xff0c;对于《堆》已经有了初步的概念&#xff0c;那么接下来我们可以…

机器学习简答题

1、请简述人工智能和机器学习&#xff0c;深度学习的关系&#xff1f; 机器学习是人工智能的一个实现途径。深度学习是机器学习的一个方法发展而来 2、根据数据集组成不同&#xff0c;通常可以把机器学习算法分为哪四类&#xff1f; 监督学习、无监督学习、半监督学习、强化…

搭建Python(3.7及以上版本)环境并安装DashScope SDK报错

搭建Python3.7及以上版本环境并安装DashScope SDK报错 搭建Python环境这里忽略&#xff0c;搭建好环境后安装 pip install dashscope但是会报错&#xff0c;如下所示&#xff1a; ERROR: Could not find a version that satisfies the requirement dashscope (from versions: …

C++中,Lambda表达式和std::function的作用及区别

Lambda表达式和std::function在C中都用于处理函数对象&#xff0c;但它们有不同的用途和使用场景。 Lambda表达式的作用是定义一个匿名函数&#xff0c;可以在需要函数对象的地方直接使用。Lambda表达式通常用于简短的函数逻辑&#xff0c;特别适合用于一些需要定义临时函数的…

flex布局(2)

五、优缺点 优点&#xff1a; 简单易用&#xff1a;Flex布局使用简单&#xff0c;只需通过设置容器的属性即可实现弹性布局&#xff0c;无需复杂的计算和调整。自适应性&#xff1a;Flex布局可以根据容器的大小自动调整元素的位置和大小&#xff0c;适应不同的屏幕尺寸和设备…