【学习记录】动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。用C语言编写

#include <iostream>
#include<cstdlib>
#include<ctime>
using namespace std;// 我的代码所犯的错误记录:
// 1. \n的换行打成了/n导致程序迟迟不能换行
// 2. rand()%4,是随机0~3的随机数,并不是0~4
// 3. 在main主函数中,首先声明int pos, val;如果在下方执行函数继续声明int pos, val;会导致变量初始化,从而使int pos, val这两个变量再次刷新,导致随机插入值不对
// 4. for循环的使用规则,内部变量i必须初始化为int类型,不然会报错// 定义自定义结构体 vector,用于模拟动态数组
typedef struct vector
{int size;   // 数组容量int count;  // 数组元素数量int* data;  // 指向数据的指钨
} vector;// 创建一个新的 vector,n 表示初始容量
vector* getNewvector(int n) {vector* p = (vector*)malloc(sizeof(vector)); // 分配 vector 结构体内存p->size = n;p->count = 0; // 初始化元素数量为 0p->data = (int*)malloc(sizeof(int) * n); // 分配数据存储内存return p;
}// 扩展 vector 的容量
int expand(vector* v) {if (v == NULL) return 0; // 检查传入参数是否为空int* p = (int*)realloc(v->data, sizeof(int) * 2 * v->size); // 重新分配内存为原来的两倍if (p == NULL) return 0; // 检查内存分配是否成功v->data = p;v->size *= 2;return 1;
}// 插入元素到指定位置
int insert(vector* v, int pos, int val) {if (pos < 0 || pos > v->count) return 0; // 检查插入位置是否有效if (v->size == v->count && !expand(v)) {return 0; // 检查容量是否足够,不足则扩展失败返回0}for (int i = v->count - 1;  i >= pos; i--){v->data[i + 1] = v->data[i]; // 将元素后移}v->data[pos] = val; // 插入新元素v->count += 1; // 增加元素数量return 1;
}// 清空 vector,释放内存
void clear(vector *v){if (v == NULL) return;free(v->data);free(v);return;
}// 输出 vector 中的内容
void output_vector(vector* v){int len = 0;for(int i = 0; i < v->size; i++){len += printf("%3d", i);}printf("\n");for (int i = 0; i < len; i++){ printf("-"); }printf("\n");for (int i = 0; i < v->count; i++) {printf("%3d", v->data[i]);}printf("\n\n");return;
}// 删除指定位置的元素
int erase(vector* v, int pos) {if (pos < 0 || pos >= v->count) return 0; // 检查删除位置是否有效for (int i = pos + 1; i < v->count; i++) {v->data[i - 1] = v->data[i]; // 将元素前移}v->count -= 1; // 减少元素数量return 1;
}int main() {srand(time(0)); // 使用当前时间作为随机数种子#define MAX_OP 20vector* v = getNewvector(2); // 创建一个初始容量为2的 vectorfor (int i = 0; i < MAX_OP; i++) {int op = rand() % 4, pos, val, ret; // 随机生成操作类型,位置,值switch (op){case 0:case 1:case 2:pos = rand() % (v->count+2); // 随机生成插入位置val = rand() % 100; // 随机生成插入值ret = insert(v, pos, val); // 插入操作printf("insert %d at %d to vector = %d\n",val, pos, ret);break;case 3:pos = rand() % (v->count + 2); // 随机生成删除位置ret = erase(v, pos); // 删除操作printf("erase item at %d in vector = %d\n", pos, erase(v, pos));break;}output_vector(v); // 输出当前 vector 内容}clear(v); // 清空 vector 并释放内存return 0;
}

这段代码实现了一个简单的动态数组(vector)数据结构,允许用户插入和删除元素,以及动态扩展数组的容量。以下是这段代码的主要功能:

  1. 结构体定义:

    • 定义了一个名为 vector 的结构体,包含了三个成员:
      • size:表示数组的容量。
      • count:表示数组中实际存储的元素数量。
      • data:是一个指向整数的指针,用于存储实际数据。
  2. 函数定义:

    • getNewvector(int n):用于创建一个新的 vector 对象,初始容量为 n。
    • expand(vector* v):扩展 vector 的容量,使其容量变为原来的两倍。
    • insert(vector* v, int pos, int val):在指定位置插入一个值为 val 的元素。
    • clear(vector *v):释放 vector 对象占用的内存,包括数据数组和 vector 结构体本身。
    • output_vector(vector* v):以漂亮的格式输出 vector 中的内容。
    • erase(vector* v, int pos):删除指定位置的元素。
  3. 主函数 main

    • 使用 srand(time(0)) 初始化随机数种子,以确保随机数的不同性。
    • 创建一个名为 v 的 vector 对象,初始容量为 2。
    • 通过循环模拟进行一系列操作,最多执行 20 次。操作类型为随机选择,包括插入元素和删除元素。
    • 随机生成操作类型和操作位置,然后调用相应的函数进行插入或删除操作。
    • 每次操作后,输出当前 vector 的内容。
    • 最后,通过 clear(v) 清空 vector 对象并释放内存。

这段代码主要用于演示一个基本的动态数组的实现,以及如何进行插入和删除操作。在主函数中,通过随机操作来测试这些功能,以及展示 vector 内容的输出。

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

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

相关文章

数据模型设计必读方法论!很实用

数据架构的重要构件之一是数据模型&#xff0c;当然从数据架构的视角来说的数据模型是指企业级数据模型。本篇文章更多是讨论如何设计和管理数据模型&#xff0c;此处的数据模型是泛指在组织中通过数据建模的过程&#xff0c;来发现、分析和确定数据需求范围&#xff0c;并用于…

Hadoop3教程(十):MapReduce中的InputFormat

文章目录 &#xff08;87&#xff09;切片机制与MapTask并行度决定机制&#xff08;90&#xff09; 切片源码总结&#xff08;91&#xff09;FileInputFormat切片机制&#xff08;92&#xff09;TextInputFormat及其他实现类一览&#xff08;93&#xff09; CombineTextInputFo…

如何实现线程安全?

简单描述一下线程安全问题&#xff1a;在程序并发执行的过程中&#xff0c;对于临界区的一些共享数据&#xff0c;可能同时会有多个线程对其进行修改&#xff0c;造成数据覆盖、脏读等一系列问题 如何实现线程安全&#xff1f; 首先想到的就是实现线程同步&#xff0c;让并发…

ChatGPT生产力|实用指令(prompt)

GPT已经成为一个不可或缺的科研生产力了&#xff0c;但是大多数人只知晓采用直接提问、持续追问以及细节展开的方式来查阅相关资料&#xff0c;本文侧重于探讨“限定场景限定角色限定主题”、“可持续追问细节展开”等多种方式来获取更多信息&#xff0c;帮人们解决更多问题。 …

移动端签名组件封装 借用插件 vue-esign

目录 需求实现讲解工具 - 图片旋转、base64 转换为 file 对象组件封装组件全局注册组件使用效果展示 需求 移动端需要实现手机横屏手写签名并上传签名图片功能。 实现讲解 vue-esign 插件文档地址 https://www.npmjs.com/package/vue-esign SignCanvas 组件封装原理&#xff1a…

数学建模——最优连接(基于最小支撑树)

一、概念 1、图的生成树 由图G(V,E)的生成子图G1(V,E1)(E1是E的子集&#xff09;是一棵树&#xff0c;则称该树为图G的生成树&#xff08;支撑树&#xff09;&#xff0c;简称G的树。图G有支撑树的充分必要条件为图G连通。 2、最小生成树问题 连通图G(V,E)&#xff0c;每条边…

OceanBase Oracle 模式下系统视图权限导致的故障一例

在 Oracle 和 OB Oracle 租户下调用存储过程时&#xff0c;两者表现并不一致&#xff0c;导致获取到的 SQL 文本拼接不完整&#xff0c;影响到了业务侧的功能测试。本文将针对这个问题进行相关的测试和验证。 作者&#xff1a;赵黎明&#xff0c;爱可生 MySQL DBA 团队成员&…

C语言实现// 输入一个英文句子,以‘ . ’结束,统计句子中包含的字符个数

完整代码&#xff1a; // 输入一个英文句子&#xff0c;以‘ . ’结束&#xff0c;统计句子中包含的字符个数 #include<stdio.h>int main(){char ch;int length0;printf("请输入一个英文句子\n");while (chgetchar()!.){length;}printf("字符个数是&…

开源CasaOS云软件发现关键漏洞

近日&#xff0c;开源 CasaOS 个人云软件中发现的两个严重的安全漏洞。该漏洞一旦被攻击者成功利用&#xff0c;就可实现任意代码执行并接管易受攻击的系统。 这两个漏洞被追踪为CVE-2023-37265和CVE-2023-37266&#xff0c;CVSS评分均为9.8分。 发现这些漏洞的Sonar安全研究…

【Java实战】创建第一个Springboot项目Hello world

没有旗舰版的Idea授权&#xff0c;所以安装了社区版的idea。不知道从何时开始&#xff0c;社区版IDEA的插件不好用了&#xff0c;所以就换了个方法生成Springboot项目。 一 在线生成 选择好对应的选项后&#xff0c;点击生成就可以下载到一个完整的springboot项目了。 二 使用…

linux安装达梦数据库(命令行安装)

安装达梦数据库 创建安装用户 1,创建安装用户组dinstall [rootdmDMServer1 ~]# groupadd -g 12345 dinstallgroupadd : 创建组 -g : 指定组id&#xff08;GID&#xff09; 12345&#xff1a; 指定的组名称 dinstall &#xff1a; 组名 2,创建安装用户dmdba [rootdmDMSe…

Mycat2 分布式数据库中间件

一.安装部署 Mycat2目前还不支持直接获取Docker镜像&#xff0c;需要自己通过Dockerfile打包镜像&#xff0c;其实这也是为了开发者考虑&#xff0c;比如一些个性化功能&#xff0c;如自定义分片等 Dockerfile FROM docker.io/adoptopenjdk/openjdk8:latestENV AUTO_RUN_DIR…

使用pdf.js预览pdf文件时如何兼容chrome66版本

最近在做一个需求&#xff0c;在PC端实现预览pdf文件的功能&#xff0c;但是要最低兼容chrome的66版本&#xff0c;因为公司用的chrome浏览器最低版本就是66版本。 现在下载PDF.js&#xff08;链接&#xff1a;https://mozilla.github.io/pdf.js/&#xff09; 下载下来的版本是…

PhotoShop字体加粗,PhotoShop字体添加边框,PhotoShop设置文字背景为图片

字体加粗 创建文字&#xff1a; 选中文字 &#xff08;用鼠标点一下&#xff09; 然后 转换为智能对象 输入合适的数值即可加粗字体 字体添加外边框 点击字体&#xff0c;点击右下角的fx 咋fx中选择描边 设置文字背景为图片 将文字放到刚刚图片所在的位置即可 。…

Vue 获取/设置指定组件高度

split-pane-left-area’是要获取的组件class&#xff0c;可以通过浏览器F12调试&#xff0c;在样式页面查看class信息 目的&#xff1a;将div的高度设置和split-pane-left-area 组件的高度一致 动态绑定style <div :style"{height: listHeight px}">获取元…

vscode工程屏蔽不使用的文件夹或文件的方法

一. 简介 vscode是一款 微软提供的免费的代码编辑软件。 对于 IMX6ULL-ALPHA开发板而言&#xff0c;NXP官方uboot一定会支持不止 IMX6ULL芯片的代码&#xff0c;也不止支持 一种架构&#xff0c;还支持其他芯片或架构的源码文件。 为了方便阅读代码&#xff0c;vscode软件可…

2024年关于湖北省建筑安全员B证报考你需要了解

2024年关于湖北省建筑安全员B证报考你需要了解 建筑安全员B证指的是建设厅三类人员建安B证&#xff0c;很多人对于B证报考不是很了解&#xff0c;对于安全员B报考条件、报考流程、报考时间、报考地区等事项叙后尘告诉你们。 湖北建筑安全员B证报考条件-建安B证 1.你的二级建造师…

SpringCloud对服务内某个client进行单独配置

文章目录 问题解决过程问题解决 问题 我们的微服务项目用的是springCloud&#xff0c;某个微服务接口因为数据处理量大&#xff0c;出现了接口超时的情况&#xff0c;我们需要单独修改这一个feignClient的超时时间。 解决过程 一开始项目只是在application文件里面进行了全局…

计算机缺失pasmutility.dll怎么办,三步解决pasmutility.dll缺失

pasmutility.dll文件是windows系统中重要的dll文件&#xff0c;电脑一旦缺失dll文件就会导致电脑无法正常运行&#xff0c;同时还会唐初电脑缺失pasmutility.dll文件的提示窗口&#xff0c;非常影响电脑运行&#xff0c;那么出现计算机缺失pasmutility.dll该怎么办呢&#xff1…

随笔--ubuntu解压zip乱码问题

ubuntu解压zip乱码问题 安装 convmv sudo apt-get install convmv安装p7zip-full sudo apt install p7zip-full 解压乱码的文件夹 LANGC 7z x filename.zip -r -o/指定解压到的目标目录执行如下命令 convmv -f gbk -t utf8 -r --notest *