当前位置: 首页 > news >正文

【数据结构】动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释:

这段C代码实现了一个动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释:

// 引入标准输入输出库和标准库函数,用于后续的内存分配和打印输出等操作  
#include <stdio.h>  
#include <stdlib.h>  // 引入时间库,用于生成随机数(这里并未使用,但保留了引入头文件)  
#include <time.h>  // 定义一个名为vector的结构体,该结构体有三个成员:size表示数组的大小,count表示数组中元素的数量,data是一个指向整型数组的指针,存储数组中的元素  
typedef struct vector {  int size, count;  int *data;  
} vector;  // getNewVector函数用于创建一个新的动态数组,并返回其指针  
vector *getNewVector(int n) {  // 使用malloc函数为vector结构体分配内存  vector *p = (vector *)malloc(sizeof(vector));  // 设置新创建的vector的大小为n,元素数量为0,并为data指针分配n个int类型的内存空间  p->size = n;  p->count = 0;  p->data = (int *)malloc(sizeof(int) * n);  // 返回新创建的vector的指针  return p;  
}  // expand函数用于扩容动态数组,将数组的大小翻倍  
int expand(vector *v) {  // 检查传入的指针是否为空,如果为空则返回0  if (v == NULL) return 0;  // 打印一条消息表示开始扩容  printf("expand v from %d to %d\n", v->size, 2 * v->size);  // 使用realloc重新分配足够的内存来存储int类型的2n个元素,并将这些元素的地址赋值给data指针  int *p = (int *)realloc(v->data, sizeof(int) * 2 * v->size);  // 如果realloc失败(返回NULL),则返回0;否则,将新分配的内存地址赋值给data,将数组的大小乘以2,并返回1表示扩容成功  if (p == NULL) return 0;  v->data = p;  v->size *= 2;  return 1;  
}  // insert函数用于在动态数组的指定位置插入一个元素  
int insert(vector *v, int pos, int val) {  // 检查插入的位置是否合法,如果不合法则返回0  if (pos < 0 || pos > v->count) return 0;  // 检查数组是否需要扩容,如果需要扩容但是扩容失败则返回0  if (v->size == v->count && !expand(v)) return 0;  // 从数组的末尾开始向前遍历每个元素,将每个元素向后移动一个位置  for (int i = v->count - 1; i >= pos; i--) {  v->data[i + 1] = v->data[i];  }  // 在指定的位置插入新的元素  v->data[pos] = val;  // 将元素数量加1,然后返回1表示插入成功  v->count += 1;  return 1;  
}  // erase函数用于从动态数组中删除指定位置的元素  
int erase(vector *v, int pos) {  // 检查删除的位置是否合法,如果不合法则返回0  if (pos < 0 || pos >= v->count) return 0;  // 从删除位置的下一个位置开始遍历每个元素,将每个元素向前移动一个位置  for (int i = pos + 1; i < v->count; i++) {  v->data[i - 1] = v->data[i];  }  // 将元素数量减1,然后返回1表示删除成功  v->count -= 1;  return 1;  
}  // 定义一个名为output_vector的函数,它接受一个指向vector结构体的指针作为参数  
void output_vector(vector* v) {  // 初始化一个整型变量len,用于存储要输出的整数之和  int len = 0;  // 遍历vector的大小(即其可以容纳的元素数量)  for (int i = 0; i < v->size; i++) {  // 在每次循环中,将整数i的值加到len上,同时输出i的值(格式化为三个数字宽)  len += printf("%3d", i);  }  // 输出一个换行符  printf("\n");  // 根据前面输出的整数数量,输出相应数量的短横线(-)以形成一个框架  for (int i = 0; i < len; i++) printf("-");  // 再输出一个换行符  printf("\n");  // 遍历vector中的元素(只遍历实际存在的元素,即count个)  for (int i = 0; i < v->count; i++) {  // 输出vector中第i个元素的值(格式化为三个数字宽)  printf("%3d", v->data[i]);  }  // 输出一个换行符  printf("\n");  // 输出两个空行,可能是为了创建视觉分隔或提供一些视觉清晰度  printf("\n\n");  // 函数结束,返回无值(void)  return;  
} // 释放动态数组内存  
void clear(vector *v) {  // 如果传入的指针为NULL,则直接返回,不进行任何操作  if (v == NULL) return ;  // 释放data指针指向的内存空间  free(v->data);  // 释放v指针指向的内存空间  free(v);  // 返回  return ;  
}  // 程序从main函数开始执行  
int main() {  // 使用当前时间作为随机数生成器的种子,这样可以使得每次运行程序时生成的随机数都不同  srand(time(0));  // 定义常量MAX_OP为20,表示要进行的操作次数  #define MAX_OP 20  // 调用getNewVector函数创建一个新的动态数组,并返回指向该数组的指针,数组的大小为2  vector *v = getNewVector(2);  // 执行MAX_OP次循环,每次循环都会随机生成一个操作和相应的参数  for (int i = 0; i < MAX_OP; i++) {  // 生成一个介于0到3之间的随机数,这个随机数将用于决定执行哪种操作  int op = rand() % 4, pos, val, ret;  // 根据随机数决定执行哪种操作  switch (op) {  // 如果操作是0、1或2,表示要进行插入操作  case 0:  case 1:  case 2:  // 生成一个介于0到(数组大小+1)之间的随机数,作为插入位置  pos = rand() % (v->count + 2);  // 生成一个介于0到99之间的随机数,作为要插入的值  val = rand() % 100;  // 调用insert函数进行插入操作,并把返回值保存在ret变量中  ret = insert(v, pos, val);  // 输出插入操作的信息,包括插入的值、插入的位置以及插入是否成功的返回值  printf("insert %d at %d to vector = %d\n", val, pos, ret);  break;  // 如果操作是3,表示要进行删除操作  case 3:  // 生成一个介于0到(数组大小+1)之间的随机数,作为删除位置  pos = rand() % (v->count + 2);  // 调用erase函数进行删除操作,并把返回值保存在ret变量中  ret = erase(v, pos);  // 输出删除操作的信息,包括删除位置以及删除是否成功的返回值  printf("erase item at %d in vector = %d\n", pos, ret);  break;  }  // 输出当前动态数组的内容  output_vector(v);  }  // 调用clear函数释放动态数组所占用的内存空间  clear(v);  // 程序正常结束,返回0  return 0;  
}

这段代码实现了一个简单的动态数组(vector),包含插入、删除和打印数组元素的功能。下面是各个函数的功能解释:

  1. getNewVector(int n):这个函数创建了一个新的动态数组,并为其分配了指定数量的整数存储空间。它返回一个指向新创建的动态数组的指针。
  2. expand(vector *v):这个函数用于将动态数组的存储空间扩大一倍。如果当前的存储空间已经足够,那么它什么都不做。否则,它会使用 realloc 函数来重新分配两倍于当前大小的存储空间,并将旧的数据复制到新的存储空间。如果扩大存储空间失败,它会返回0,否则返回1。
  3. insert(vector *v, int pos, int val):这个函数在动态数组中插入一个新的元素。它首先检查插入的位置是否有效,然后检查是否需要扩大存储空间。如果需要扩大存储空间且扩大操作失败,它会返回0。否则,它会将数组中的所有元素向后移动一位,然后在指定的位置插入新的元素。最后,它会返回1表示插入成功。
  4. erase(vector *v, int pos):这个函数从动态数组中删除一个元素。它首先检查删除的位置是否有效,然后删除元素并返回1表示删除成功。
  5. output_vector(vector *v):这个函数打印动态数组的所有元素和它们的位置(包括空位)。
  6. clear(vector *v):这个函数释放动态数组的内存空间。

相关文章:

【数据结构】动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释:

这段C代码实现了一个动态数组&#xff08;vector&#xff09;的基本操作&#xff0c;包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释&#xff1a; // 引入标准输入输出库和标准库函数&#xff0c;用于后续的内存分配和打印输出等操作 #include <stdio.…...

[unity]三角形顶点顺序

序 详见官方文档&#xff1a;Unity - Manual: Mesh data (unity3d.com) Topology&#xff1a;拓扑结构 翻译&#xff1a; 拓扑描述网格具有的面类型。 网格的拓扑定义了索引缓冲区的结构&#xff0c;索引缓冲区又描述了顶点位置如何组合成面。每种类型的拓扑都使用索引数组中…...

【python爬虫】14.Scrapy框架讲解

文章目录 前言Scrapy是什么Scrapy的结构Scrapy的工作原理 Scrapy的用法明确目标与分析过程代码实现——创建项目代码实现——编辑爬虫代码实现——定义数据代码实操——设置代码实操——运行 复习 前言 前两关&#xff0c;我们学习了能提升爬虫速度的进阶知识——协程&#xf…...

功率放大器主要作用是什么呢

功率放大器是一种电子设备&#xff0c;主要作用是将输入信号的功率增加到更高的水平&#xff0c;以便能够驱动高功率负载。在许多应用中&#xff0c;信号源产生的信号往往具有较低的功率&#xff0c;无法直接满足一些要求较高的设备或系统的需求。而功率放大器则可以增强信号的…...

SpringBoot ApplicationEvent详解

ApplicationStartingEvent 阶段 LoggingApplicationListener#onApplicationStartingEvent 初始化日志工厂,LoggingSystemFactory接口&#xff0c;可以通过spring.factories进行定制 可以通过System.setProperty("org.springframework.boot.logging.LoggingSystem",&q…...

WebSocket 报java.io.IOException: 远程主机强迫关闭了一个现有的连接。

在客户端强制关闭时&#xff0c;或者窗口强制关闭时&#xff0c;后端session没有关闭。 有时还会报&#xff1a;java.io.EOFException: 这个异常 前端心跳没有收到信息&#xff0c;还在心跳。 CloseReason close new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, &…...

关于git约定式提交IDEA

背景 因为git提交的消息不规范导致被乱喷&#xff0c;所以领导统一规定了约定式提交 官话 约定式提交官网地址 约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史&#xff1b; 这更有利于编写自动化工具。 通过在提交信息中描述功能…...

【计算机网络】http协议

目录 前言 认识URL URLEncode和URLDecode http协议格式 http方法 GET POST GET与POST的区别 http状态码 http常见header 简易的http服务器 前言 我们在序列化和反序列化这一章中&#xff0c;实现了一个网络版的计算器。这个里面设计到了对协议的分析与处…...

仓库太大,clone 后,git pull 老分支成功,最新分支失败

由于 git 仓库太大&#xff0c;新加入的小伙伴在拉取时&#xff0c;无法切换到最新的分支&#xff0c;报错如下&#xff1a; fetch-pack: unexpected disconnect while reading sideband packet fatal: early EOF fatal: fetch-pack: invalid index-pack output在此记录解决步…...

javafx Dialog无法关闭

// 生成二维码图片String qrCodeText "https://example.com";DialogPane grid new DialogPane();grid.setPadding(new Insets(5));VBox vBox new VBox();vBox.setAlignment(Pos.CENTER);Image qrCodeImage generateQRCodeImage(qrCodeText);ImageView customImag…...

vue3中TCplayer应用

环境win10:vitevue3elementUI 1 安装 npm install tcplayer.js2 使用 <template><div><video id"player-container-id" width"414" height"270" preload"auto" playsinline webkit-playsinline></video>&l…...

算法通关村14关 | 数据流中位数问题

1. 数据流中位数问题 题目 LeetCode295: 中位数是有序列表中间的数&#xff0c;如果列表长度是偶数&#xff0c;中位数是中间两个数的平均值&#xff0c; 例如:[2,3,4]的中位数是3&#xff0c; [2,3]中位数是&#xff08;23&#xff09;/ 2 2.5 设计一个数据结构&#xff1a; …...

工厂模式 与 抽象工厂模式 的区别

工厂模式&#xff1a; // 抽象产品接口 interface Product {void showInfo(); }// 具体产品A class ConcreteProductA implements Product {Overridepublic void showInfo() {System.out.println("This is Product A");} }// 具体产品B class ConcreteProductB impl…...

安装虚拟机+安装/删除镜像

安装虚拟机 注意&#xff0c;官网可能无法登录&#xff0c;导致无法从官网下载&#xff0c;就自己去网上搜靠谱的下载&#xff0c;我用的16.2.3 删除镜像 Vm虚拟机怎么删除已经创建的系统&#xff1f;Vm虚拟机创建好之后iso删除方法 - 系统之家 (xitongzhijia.net) 安装镜像…...

MySQL的内置函数复合查询内外连接

文章目录 内置函数时间函数字符串函数数学函数其他函数 复合查询多表笛卡尔积自连接在where中使用子查询多列子查询在from中使用子查询 内连接外连接左外连接右外连接 内置函数 时间函数 函数描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳…...

操作系统(OS)与系统进程

操作系统&#xff08;OS&#xff09;与系统进程 冯诺依曼体系结构操作系统(Operator System)进程基本概念进程的描述&#xff08;PCB&#xff09;查看进程通过系统调用获取进程标示符&#xff08;PID&#xff09;通过系统调用创建进程&#xff08;fork&#xff09;进程状态&…...

防重复提交:自定义注解 + 拦截器(HandlerInterceptor)

防重复提交&#xff1a;自定义注解 拦截器&#xff08;HandlerInterceptor&#xff09; 一、思路&#xff1a; 1、首先自定义注解&#xff1b; 2、创建拦截器实现类&#xff08;自定义类名称&#xff09;&#xff0c;拦截器&#xff08;HandlerInterceptor&#xff09;; 3…...

Excel中将文本格式的数值转换为数字

在使用excel时&#xff0c;有时需要对数字列进行各种计算&#xff0c;比如求平均值&#xff0c;我们都知道应该使用AVERAGE()函数&#xff0c;但是很多时候结果却“不尽如人意”。 1 问题&#xff1a; 使用AVERAGE函数&#xff1a; 结果&#xff1a; 可以看到单元格左上角有个…...

uni-app开发小程序中遇到的map地图的点聚合以及polygon划分区域问题

写一篇文章来记录以下我在开发小程序地图过程中遇到的两个小坑吧&#xff0c;一个是点聚合&#xff0c;用的是joinCluster这个指令&#xff0c;另一个是polygon在地图上划分多边形的问题&#xff1a; 1.首先说一下点聚合问题&#xff0c;由于之前没有做过小程序地图问题&#…...

【笔记】软件测试的艺术

软件测试的心理学和经济学 测试是为发现错误而执行程序的过程&#xff0c;所以它是一个破坏性的过程&#xff0c;测试是一个“施虐”的过程。 软件测试的10大原则 1、测试用例需要对预期输出的结果有明确的定义 做这件事的前提是能够提前知晓需求和效果图&#xff0c;如果不…...

配置本地maven

安装maven安装包 修改环境变量 vim ~/.bash_profile export JMETER_HOME/Users/yyyyjinying/apache-jmeter-5.4.1 export GOROOT/usr/local/go export GOPATH/Users/yyyyjinying/demo-file/git/backend/go export GROOVY_HOME/Users/yyyyjinying/sortware/groovy-4.0.14 exp…...

C# 按钮的AcceptButton和CancelButton属性

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...

SMT贴片制造:专业、现代、智能的未来之选

在现代科技的快速发展下&#xff0c;SMT贴片制造作为电子元器件的核心工艺之一&#xff0c;正以其专业、现代和智能的特点成为未来的首选。 随着电子产品越来越小型化&#xff0c;传统的手工焊接已经无法满足高速、高精度、高稳定性的要求。而SMT贴片制造作为一种先进的表面贴…...

python sqlalchemy db.session 的commit()和colse()对session中的对象的影响

实验一&#xff1a;commit&#xff08;&#xff09;之后查看stu的属性id,查看db.session是否改变 db_test.route("/db_test",methods["GET"]) def db_test():stuStuTest()stu.stu_age22stu.stu_name"nnannns"stu.stu_class11print("sessio…...

python读取图像小工具

一、和图像交互获得图像的坐标和像素值 import cv2 import numpy as np import signal import threading import timeif __name__ __main__:img cv2.imread(XXX,0)#读取图片font_face,font_scale,thicknesscv2.FONT_HERSHEY_SIMPLEX,0.5,1#鼠标交互def mouseHandler(event,x…...

【ES6】JavaScript中Reflect

Reflect是JavaScript中的一个内建对象&#xff0c;它提供了一组方法&#xff0c;用于对对象和函数进行操作和检查。这些方法与内建对象的方法非常相似&#xff0c;但具有更高的灵活性。 以下是Reflect对象的一些常用方法&#xff1a; 1、Reflect.apply(target, thisArgument,…...

Ajax + Promise复习简单小结simple

axios使用 先看看老朋友 axios axios是基于Ajaxpromise封装的 看一下他的简单使用 安装&#xff1a;npm install axios --save 引入&#xff1a;import axios from axios GitHub地址 基本使用 axios({url: http://hmajax.itheima.net/api/province}).then(function (result…...

WebDAV之π-Disk派盘 + 小书匠

小书匠是一款功能丰富,强大的知识管理工具。全平台覆盖,离线数据存储,自定义数据服务器,所见即所得的 markdown 编辑体验。 小书匠提供了多种实用的编辑模式,例如:栏编辑、双栏编辑、三栏编辑、全屏写作、全屏阅读等。并且该软件还提供了许多有用的扩展语法,比如Latex公…...

LTE ATTACH流程、PDN流程、PGW地址分配介绍

1、S-GW\P-GW选择 MME根据S-GW和P-GW的拓扑信息进行S-GW/P-GW的选择&#xff0c;在S-GW的候选序列和P-GW的候选序列中比较&#xff0c;寻找是否有合一的S-GW/P-GW&#xff0c;并且根据S-GW的优先级和权重信息进行排序&#xff0c;得到S-GW/P-GW的候选组。 2、SGW>PGW连接 PD…...

SQL sever中用户管理

目录 一、用户管理常见方法 二、用户管理方法示例 2.1. 创建登录账户&#xff1a; 2.1.1 检查是否创建账户成功&#xff1a; 2.2. 创建数据库用户&#xff1a; 2.2.1检查用户是否创建成功&#xff1a; 2.3. 授予权限&#xff1a; 2.3.1授予 SELECT、INSERT 和 U…...

it运维外包服务方案/seo网站排名优化快速排

一、接口测试的本质 &#xff1a;只是做了数据传递 二、接口测试的核心含义 &#xff1a;能够把请求发出去&#xff0c;然后接收的响应结果&#xff0c;结束是否达到我们的预期 三、Jmeter进行接口测试的固定流程 1.用工具创建HTTP请求 2.用工具发出请求 3.校验数据&#xff…...

c 做网站网站/网页模板免费下载网站

首先用恶意软件和木马强杀工具Windows清理助手(下载网址&#xff1a; )&#xff0c;在安全模式中查杀恶意软件和木马。1、如果故障依旧&#xff0c;请你用系统自带的系统还原&#xff0c;还原到你没有出现这次故障的时候修复(如果正常模式恢复失败&#xff0c;请开机按F8进入到…...

影院资讯 wordpress/北京seo顾问服务

请写出图的邻接矩阵和邻接表&#xff0c;深度和广度遍历结果&#xff0c;最小生成树的结果 1.邻接矩阵 详见本人博客&#xff1a;图的存储结构&#xff1a;邻接矩阵 2.邻接表 详见本人博客&#xff1a;图的存储结构&#xff1a;邻接表 3.深度遍历结果&#xff1a;1234657 &am…...

男女做爰网站19/乔拓云智能建站系统

介绍如何使用机密消息解码器 检查Visual Studio Code是否已准备好执行消息解码 在计算机上创建用于代码的文件玩意儿。文件夹命名为Sleuth。 鼠标放在Sleuth文件夹&#xff0c;右键点击“在终端中打开”。 输入命令行&#xff1a; 打开Visual Studio Code 创建文件&#xff0c;…...

做网站需要懂代码么/网站制作教程视频

任务Task01: Go初探(1天)Task02: 数据类型、关键字、标识符(1天)Task03: 变量、常量、枚举(1天)Task04: 运算符、控制语句(1天)Task05: 字典、字符串(1天)Task06: 数组、切片(1天)Task07: 函数(1天)Task08: 结构体、方法、接口(1天)Task09: 包管理(1天)Task10: 异常处理(1天)Ta…...

做纸巾定制的网站/制作一个网站需要多少费用

题目均来自牛客网 1、 有以下代码片段&#xff1a; String str1"hello"; String str2"he" new String("llo"); System.out.println(str1str2); 请问输出的结果是&#xff1a;false - 解 类似问题连接&#xff1a; String is immutable. W…...