第一篇:如何在数组中操作数据【数据结构入门】

记录以下自己重温数据结构的笔记,附带自己实现的C代码,
其中部分Python代码是网上教程里的,顺手粘贴过来,做一对比/
(Python确实简洁,但是C更好理解不是吗哈哈哈)

数组的定义

数组:线性表数据结构,利用一段连续的内存空间,存储相同类型的数据
数组中的每个元素有唯一的下标索引
两个角度理解数组:线性表结构,连续的内存空间,本质:采用顺序存储结构的线性表

随机访问数据元素

数组最显著的特点:支持随机访问,就是通过下标直接定位并访问任意一个元素
本质:第一个元素地址为首地址,每个元素都有唯一的下标和对应的内存地址,访问数组元素时,利用下标通过寻址公式快速计算出目标元素的内存地址,实现高效访问
寻址公式:下标 i 的元素地址 = 首地址 + i × 单个元素占用的字节数

多维数组

一般由m行n列的数据元素组成,本质上可理解为数组的数组,每个元素本身也是一个数组。
第一维表示行,第二维表示列。内存中,二维数组通常采用行优先或列优先的存储方式。
二维数组常被视为矩阵,可用于处理如矩阵转置、矩阵加法、矩阵乘法等问题。

数组在不同编程语言中的实现

不同编程语言中的数据实现存在一定差异。
C/C++中的数组最贴合其定义:他们使用一块连续的内存空间来存储相同类型的数据元素。
无论是基本数据类型,还是结构体、对象,在数组中都以连续方式排列。

int arr[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};

Java中的数组类似于C,但在多维数组的情况下,其允许创建不规则数组,即每个嵌套数组的长度可以不同。

int[][] arr = new int[3][];
arr[0] = new int[]{1, 2, 3};
arr[1] = new int[]{4, 5};
arr[2] = new int[]{6, 7, 8, 9};

Python使用“列表”这种容器类型,类似于Java中的ArrayList,通常将其作为数组使用,与传统数组不同的是,Python不仅可以存储不同类型的数据元素,长度也可以动态变化,并且支持丰富的内置方法。

arr = ['python', 'java', ['asp', 'php'], 'c']

数组的几种基本操作

基本上,数组的操作主要涉及“增删改查”四类,掌握这个就可以说掌握了数组的具体应用

访问元素

假设我们要访问数组中第 i 个元素:

  1. 首先检查下标 i 是否在合法范围内,即 0 ≤ i ≤ len(nums)-1,超出该范围属于非法访问
  2. 如果下标合法,则可直接通过下标获取对应元素的值
  3. 如果下标不合法,则抛出异常或返回特殊值
  4. 访问数组元素不依赖于数组元素个数,因此其时间复杂度为O(1)
  5. C语言不会在访问时检查数组下标是否越界,因此编程者必须自己确保索引在有效范围内
int arr[10] = {1, 2, 3, 4, 56, 7, 89, 999};int main() {printf("the first number is %d\n", arr[3]);arr[3] = 8;printf("the second number is %d\n", arr[3]);return 0;
}
// 从数组 nums 中读取下标为 i 的数据元素值
def get_element(nums: list[int], index: int):"""获取数组中指定下标的元素值"""if 0 <= index < len(nums):return nums[index]else:raise IndexError(f"数组下标 {index} 超出范围 [0, {len(nums)-1}]")//示例用法
arr = [0, 5, 2, 3, 7, 1, 6]
print(get_element(arr, 3))  # 输出: 3

查找元素

查找数组中元素值为 val 的位置

  1. 遍历数组,将目标值与每个元素进行比较
  2. 找到匹配元素时返回其下标
  3. 遍历完未找到时返回特殊值
  4. 当数组无序时,查找元素只能通过将 val 与数组中的每个元素依次比较,这种方式称为线性查找。由于需要遍历整个数组,线性查找的时间复杂度为O(n)
int arrfind(int nums[], int size, int val) {for (int i = 0; i < size; i++) {if(nums[i] == val){return i;}}return -1;
}int arr[] = {1, 2, 3, 4, 56, 7, 89, 999};int main() {// 查找数组元素int arr_size = sizeof(arr);// sizeof(arr[0]);// 在arr数组中寻找元素3int i1 = arrfind(arr,arr_size,3);printf("num 5 index is: %d\n",i1);// 在arr数组中寻找元素15int i2 = arrfind(arr,arr_size,15);printf("num 15 index is: %d\n",i2);return 0;
}
def find_element(nums: list[int], val: int):"""查找数组中元素值为 val 的位置"""for i in range(len(nums)):if nums[i] == val:return ireturn -1示例用法
arr = [0, 5, 2, 3, 7, 1, 6]
print(find_element(arr, 5))  # 输出: 1
print(find_element(arr, 9))  # 输出: -1 (未找到)

插入元素

在数组的第 i 个位置插入值 val

  1. 检查 i 是否在数组范围之内
  2. 拓展数组长度,为新元素腾出空间
  3. 将 i 及其之后的元素整体向后移动一位
  4. 在 i 位置插入 val
bool insert_element(int arr[], int *currentSize, int maxSize, int index, int val) {// 检查索引是否有效:必须在 0 到 currentSize 之间(含)// 注意:可以在末尾插入,即 index == *currentSizeif (index < 0 || index > *currentSize) {printf("错误:插入索引 %d 越界!有效范围是 [0, %d]\n", index, *currentSize);return false;}// 检查数组是否已满if (*currentSize >= maxSize) {printf("错误:数组已满,无法插入新元素!\n");return false;}// 【关键步骤】 从最后一个元素开始,逐个向后移动,为新元素腾出空间for (int i = *currentSize - 1; i >= index; i--) {arr[i + 1] = arr[i];}// 在指定位置插入新值arr[index] = val;// 更新数组的实际大小(*currentSize)++;return true;
}

改变元素

将数组中的第 i 个元素改为 val

  1. 检查 i 是否在数组长度之内
  2. 将第 i 个元素值赋值为 val
// 改变数组指定的元素值
bool change_array(int arr[], int size, int index, int val)
{if (index < 0 || index >= size) {printf("错误:赋值索引 %d 越界!有效范围是 [0, %d]\n", index, size);return false;}arr[index] = val;return true;
}

删除元素

删除数组中指定 i 位置的元素

  1. 检查下标 i 是否在合法的范围内
  2. 将 i + 1 位置及其之后的元素整体向前移动一位
  3. 删除最后一个元素(或更新数组长度)
  4. 删除元素需要移动后续元素,移动次数与数组长度有关,因此时间复杂度为O(n)
/*** 删除数组中指定索引位置的元素* @param arr: 目标数组* @param currentSize: 指向当前数组元素个数的指针(函数会修改它)* @param index: 要删除的元素索引* @return: 成功返回 true,失败(索引越界)返回 false*/
bool delete_element(int arr[], int *currentSize, int index) {// 检查索引是否有效:必须在 [0, currentSize - 1] 范围内if (index < 0 || index >= *currentSize) {printf("错误:删除索引 %d 越界!有效范围是 [0, %d)\n", index, *currentSize);return false;}// 从 index + 1 开始,将每个元素向前移动一位for (int i = index; i < *currentSize - 1; i++) {arr[i] = arr[i + 1];}// 逻辑上减少数组大小(*currentSize)--;return true;
}

总结

数组采用连续的内存空间来存储相同类型的数据,其优势在于支持随机访问,可以通过下标高效定位和访问任意元素
数组的访问和修改操作时间复杂度为时间复杂度为O(1),而插入和删除操作需要移动元素,时间复杂度为O(n)
这部分内容需要掌握的是逻辑(其实概括一下都是先校验索引范围,再操作数据,最后打印出来展示,三步走),具体的实现比较简单,实际应用中更应关注函数、指针等细节方面

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

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

相关文章

基于STM32的单片机开发复盘

硬件介绍 底盘&#xff1a;幻尔阿克曼底盘&#xff1b;2个直流霍尔电机、1个PWM舵机开发板&#xff1a;幻尔Ros Controller V1.2&#xff08;STM32F407VET6&#xff09;电源&#xff1a;因为是学习阶段&#xff0c;没有配电池&#xff0c;使用120W可调电源&#xff08;3V~12V&a…

面试常问:注册中心宕机,远程调用还能成功吗?

在微服务架构里&#xff0c;注册中心&#xff08;像 Nacos、Eureka、Consul 等&#xff09;是服务发现与治理的核心。可要是注册中心突然宕机&#xff0c;微服务间的远程调用还能顺利进行吗&#xff1f;这是面试时很常被问到的问题&#xff0c;下面我们就来深入剖析。一、远程调…

《用 Python 和 Matplotlib 绘制折线图:从入门到实战的可视化指南》

《用 Python 和 Matplotlib 绘制折线图:从入门到实战的可视化指南》 一、引言:数据可视化的力量,从一张折线图开始 在我多年的开发与教学经历中,最常被问到的问题之一是:“如何让数据更直观?”我的答案始终如一:用图说话。而在众多图表类型中,折线图以其简洁、清晰的…

Seate的XA模式和AT模式

目录 一、XA模式 【1】两阶段提交 【2】Seata的XA模型 【3】优缺点 【4】实现XA模式 二、AT模式 【1】Seata的AT模型 【2】AT与XA的区别 【3】脏写问题 【4】优缺点 【5】实现AT模式 一、XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xf…

CTFHub SSRF通关笔记6:Gopher Redis原理详解与渗透实战

目录 一、SSRF Gopher Redis 1、功能简介 2、攻击原理 &#xff08;1&#xff09;SSR的作用 &#xff08;2&#xff09;Gopher 协议特性 &#xff08;3&#xff09;攻击 Redis 步骤 二、gopherus 1、功能简介 2、攻击Redis服务方法 三、Gopherus安装 1、源码下载 2…

数据结构之二叉树(2)

数据结构之二叉树&#xff08;2&#xff09;1.二叉树的存储结构2.实现顺序结构二叉树2.1何为堆2.2堆的性质2.3堆的定义2.3堆的初始化与销毁3.1向上调整算法3.2向下调整算法4.入堆5.出堆让花成花&#xff0c;让树成树上一次我们学习了树的分类&#xff0c;并初步了解了二叉树。今…

Linux操作系统之Ubuntu

Ubuntu是基于Debian的开源Linux发行版&#xff0c;由Canonical公司维护&#xff0c;以用户友好性和稳定性著称。它广泛应用于个人电脑、服务器及云计算环境&#xff0c;支持多种硬件架构。Ubuntu的特点Ubuntu提供定期更新版本&#xff08;每6个月&#xff09;和长期支持版本&am…

kotlin的函数前面增加suspend关键字的作用

deepseek回答&#xff1a; Kotlin中suspend关键字的作用详解 核心作用 suspend关键字用于标记‌挂起函数‌&#xff0c;使其能够在协程中实现非阻塞的异步操作。 suspend关键字的本质作用 suspend关键字的主要作用是‌标记一个函数为挂起函数‌&#xff0c;使其能够在协程中使用…

Vibe Coding实战项目:用Qwen3-Coder做了个AI跳舞视频生成器

大家好&#xff0c;这里是K姐。 一个 Vibe Coding 的探索者。 前段时间发现通义发起了一个Qwen3-Coder挑战赛&#xff0c;最高奖金有10000元&#xff0c;研究了一下&#xff0c;我发现这个赛道太宽了&#xff0c;不限项目&#xff0c;用 AI Coding 做数据分析、个人Blog、抓取…

Kafka面试精讲 Day 13:故障检测与自动恢复

【Kafka面试精讲 Day 13】故障检测与自动恢复 在“Kafka面试精讲”系列的第13天&#xff0c;我们将深入探讨 Kafka 高可用体系中的关键一环&#xff1a;故障检测与自动恢复机制。作为分布式系统的核心能力&#xff0c;Kafka 如何在 Broker 宕机、网络分区或磁盘故障时快速感知…

【前沿技术拓展Trip Two】具身智能

具身智能&#xff08;Embodied AI&#xff09;的认识&#xff0c;进展&#xff0c;以及为何难以实现 在讲具身智能之前&#xff0c;我们不得不先行介绍一下离身智能与离身认识系统这两个极其相关且更加常见的概念 离身认识系统 其实目前绝大多数的AI&#xff0c;例如DeepSeek&a…

使用electron将vue3网页项目包装成pc客户端

一、准备前工作在项目的根目录 打开命令行工具 安装四个依赖库安装报错的话二、准备工作完成之后&#xff0c;在项目根目录需要有俩个文件在项目根目录创建electron文件夹在vite.config.js中添加配置项在package.json中添加配置项运行命令 npm run electron:build 打包关于mac&…

基于安全抽象模型(SAM)的汽车网络安全防御与攻击分析

摘要自动驾驶汽车比以往任何一种个人出行交通工具都具有更大的受攻击可能性。这主要是因为这类汽车对通信有极高的需求&#xff0c;一方面是出于功能和安全方面的考虑&#xff0c;另一方面则是为了满足舒适性需求。无人驾驶汽车需要与周围环境进行通信的接口、直接连接&#xf…

线扫相机不出图原因总结

1、帧触发信号有问题 线扫相机出图由帧信号决定开始采集,如果没有帧信号线扫相机无法识别开始信号,所以不出图 1)没有给相机帧信号 帧信号是一个短暂的脉冲信号,持续时间不要太长,相机能识别就可以,一般由plc或者控制卡的数字量输出口触发,可以通过监测数字量输出口来确…

开发避坑指南(46):Java Stream 对List的BigDecimal字段进行求和

需求 对int&#xff0c;long类型的数据求和直接用stream().mapToInt()、stream().mapToDouble()&#xff0c;可是没有stream().mapToBigDecimal()这样的方法&#xff0c;那么如何用stream对List的BigDecimal字段进行求和&#xff1f; 代码实现 直接上代码 public class OrderIn…

pycharm如何处理python项目间引用

1. 如何在pycharm中将其它项目添加到打开的项目中 如图所示&#xff1a;文件->打开->附加&#xff08;Attach&#xff09;即可2.如何引用:直接作为一个普通package引用即可 from attack_projectxxx.modulexxx import xxx3.pyinstaller如何编译这种引用其它项目的可执行文…

家庭劳务机器人发展阶段与时间预测

家庭劳务机器人大规模进入家庭不会是一个单一的时间点&#xff0c;而是一个分阶段、渐进式的过程。我们可以将这个进程分为以下几个阶段&#xff0c;并对每个阶段的时间线进行预测&#xff1a;第一阶段&#xff1a;单一功能机器人普及&#xff08;现在 - 2025年&#xff09;这个…

Zynq开发实践(FPGA之spi实现)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】虽然串口用的地方比较多&#xff0c;实现起来也比较简单。但是串口本身速度比较慢&#xff0c;不利于高速数据通信。而且单个串口没有办法和很多芯片…

指甲打磨机/磨甲器MCU控制方案开发,轻松解决磨甲问题

美甲打磨机/指甲打磨机核心功能需求 1. 基础功能 无级调速(5,000-30,000 RPM&#xff0c;PWM控制) 正反转切换&#xff08;可选&#xff0c;用于抛光/去角质&#xff09; 按键锁/防误触&#xff08;长按3秒解锁&#xff09; 锂电池管理&#xff08;3.7V单节&#xff0c;带充电指…

临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 随着电子健康记录&#xff08;EHR&#xff09;的普…