数据结构-数组(详细讲解)

文章目录

    • 数组
      • 数组的概述
      • 数组的图示
        • 一维数组
        • 二维数组
      • 数组的定义
        • 一维数组的定义
        • 二维数组的定义
      • 数组的取值赋值
        • 一维数组
        • 二维数组
      • 数组的操作
        • 一维数组的操作
          • 索引实现
          • 指针实现
        • 二位数组的操作
          • 矩阵转三元组
          • 矩阵的乘法

数组

数组的概述

  • 概述:数组是一种线性数据结构,它由一组按顺序排列的元素组成。每个元素都有一个唯一的索引,用于访问和操作该元素。数组可以包含任意类型的数据,如整数、浮点数、字符串等
  • 注意:数组是只能存储一种数据类型,且数组一旦创建,大小就固定的容器。
  • 优缺点:
    • 数组的优点,快速访问和搜索速度,因为元素的位置是固定的,可以通过索引直接访问
    • 数组的缺点,插入和删除操作可能会导致大量元素的移动,从而影响性能,并且数组的大小一旦创建就是固定的
  • 种类:
    • 一维数组
    • 二维数组(二维数组其实就是多维数组,像一个表格一样)
    • 多维数组

数组的图示

一维数组

二维数组
  • 二维数组可以看成一个表格,下边就是一个4行3列的二维数组

  • 二维数组也可以看成一维数组中嵌套一维数组的样式,下边图也是一个 4行3列的二维数组

数组的定义

一维数组的定义
  • 格式

    // 格式一
    数据类型 数组名[长度];
    // 格式二
    数据类型 数组名[长度] = {1,2...值n};
    // 格式三
    数据类型 数组名[] = {1,2...值n};
    
  • 示例

    // 定义一个长度为 5 的整型数组
    int a[5];
    // 定义一个长度为 5 的整型数组,并初始化(初始化就是赋值的意思)
    int b[5] = {1,2,3,4,5};
    // 定义一个整型数组,并初始化,可以看到方括号中并无长度,是因为初始化列表自动推断数组的大小
    int c[] = {1,2,3,4,5};
    
二维数组的定义
  • 格式

    // 格式一
    数据类型 数组名[行数][列数];
    // 格式二
    数据类型 数组名[行数][列数] = {{1,2...值n},{1,2...值n},...,{1,2...值n}};
    // 格式三
    数据类型 数组名[][列数] = {{1,2...值n},{1,2...值n},...,{1,2...值n}};
    
  • 示例

    // 定义一个3行4列的整型二维数组
    int a[3][4];
    // 定义一个3行4列的整型二维数组,并初始化
    int b[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    // 初始化列表自动推断数组是多少行
    int c[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    

数组的取值赋值

一维数组
#include <stdio.h>					// 打印需要靠这个 标准输入输出库int main() {// 定义一个一维数组int arr[] = {1, 2, 3, 4, 5};// 访问数组中的元素printf("%d\n", arr[0]);  // 输出:1printf("%d\n", arr[2]);  // 输出:3// 修改数组中的元素arr[3] = 6;for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);  // 输出:1 2 3 6 5}// 获取数组的长度int length = sizeof(arr) / sizeof(arr[0]);printf("\n%d\n", length);  // 输出:5return 0;
}
二维数组
#include <stdio.h>int main() {// 定义一个二维数组int arr2d[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};// 访问二维数组中的元素printf("%d\n", arr2d[0][0]);  // 输出:1printf("%d\n", arr2d[1][2]);  // 输出:6// 修改二维数组中的元素arr2d[2][1] = 10;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {printf("%d ", arr2d[i][j]);  // 输出:1 2 3 4 5 6 7 10 9}}// 获取二维数组的行数和列数int rows = sizeof(arr2d) / sizeof(arr2d[0]);int cols = sizeof(arr2d[0]) / sizeof(arr2d[0][0]);printf("\n%d %d\n", rows, cols);  // 输出:3 3return 0;
}

数组的操作

一维数组的操作
索引实现
#include <stdio.h>// 使用索引进行操作
void arrayOperationsWithIndex(int arr[], int size) {// 插入操作,insertIndex 是要插入的位置,insertValue 是要插入的值int insertIndex = 2;int insertValue = 10;// 将插入位置之后的元素依次向后移动for (int i = size - 1; i >= insertIndex; i--) {arr[i + 1] = arr[i];}// 插入元素arr[insertIndex] = insertValue;// 改变数组长度size++;// 删除操作int deleteIndex = 3;// 将 deleteIndex 之后的元素依次前移,覆盖for (int i = deleteIndex; i < size - 1; i++) {arr[i] = arr[i + 1];}size--;// 修改操作int modifyIndex = 1;int newValue = 20;arr[modifyIndex] = newValue;// 查找操作int target = 20;int found = 0;for (int i = 0; i < size; i++) {if (arr[i] == target) {printf("元素 %d 找到了,索引为 %d\n", target, i);found = 1;break;}}if (!found) {printf("未找到元素 %d\n", target);}
}
int main() {int arr1[10] = {1, 2, 3, 4, 5};int size1 = 5;// 使用索引进行操作arrayOperationsWithIndex(arr1, size1);return 0;
}
指针实现
#include <stdio.h>
// 使用指针进行操作
void arrayOperationsWithPointer(int *arr, int *size) {// 插入操作int insertIndex = 2;int insertValue = 10;for (int i = *size - 1; i >= insertIndex; i--) {*(arr + i + 1) = *(arr + i);}*(arr + insertIndex) = insertValue;(*size)++;// 删除操作int deleteIndex = 3;for (int i = deleteIndex; i < *size - 1; i++) {*(arr + i) = *(arr + i + 1);}(*size)--;// 修改操作int modifyIndex = 1;int newValue = 20;*(arr + modifyIndex) = newValue;// 查找操作int target = 20;int found = 0;for (int i = 0; i < *size; i++) {if (*(arr + i) == target) {printf("元素 %d 找到了,索引为 %d\n", target, i);found = 1;break;}}if (!found) {printf("未找到元素 %d\n", target);}
}
int main() {int arr2[10] = {1, 2, 3, 4, 5};int size2 = 5;// 使用指针进行操作arrayOperationsWithPointer(arr2, &size2);return 0;
}
二位数组的操作
矩阵转三元组

#include <stdio.h>// 定义矩阵的行数和列数
#define ROWS 3
#define COLS 3// 定义矩阵转换为三元组的结构体
typedef struct Triple {int row;				// 行int col;				// 列int value;				// 值
}Triple;/* 定义矩阵转换为三元组的函数参数:matrix[ROWS][COLS]		矩阵,用二维数组实现rows					矩阵行数cols					矩阵列数triple[]				三元组数组
*/
int convertToTriple(int matrix[ROWS][COLS], int rows, int cols, Triple triple[]) {int count = 0;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (matrix[i][j] != 0) {/*下边四行代码释义:1、将不等于0元素的行值存到三元组中2、将不等于0元素的列值存到三元组中3、将不等于0元素的值存到三元组中4、行数加1*/triple[count].row = i;triple[count].col = j;triple[count].value = matrix[i][j];count++;}}}return count;
}int main() {// 定义一个矩阵int matrix[ROWS][COLS] = {{1, 0, 0},{0, 2, 0},{0, 0, 3}};// 打印原始矩阵printf("原始矩阵:\n");for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {printf("%d ", matrix[i][j]);}printf("\n");}// 将矩阵转换为三元组Triple triple[ROWS * COLS];int count = convertToTriple(matrix, ROWS, COLS, triple);// 打印三元组printf("转换后的三元组:\n");for (int i = 0; i < count; i++) {printf("(%d, %d, %d)\n", triple[i].row, triple[i].col, triple[i].value);}return 0;
}

三元组,就是将矩阵压缩的一种形式,将非零元素值的位置和值存到三元组数组中,零元素值不存储

矩阵的乘法

#include <stdio.h>#define ROWS1 2
#define COLS1 3
#define ROWS2 3
#define COLS2 2/*矩阵乘法函数参数:mat1[ROWS1][COLS1]					矩阵1mat2[ROWS2][COLS2]					矩阵2result[ROWS1][COLS2]				结果矩阵
*/ 
void matrixMultiply(int mat1[ROWS1][COLS1], int mat2[ROWS2][COLS2], int result[ROWS1][COLS2]) {// 遍历矩阵1的行for (int i = 0; i < ROWS1; i++) {// 遍历矩阵2的列for (int j = 0; j < COLS2; j++) {// 首先将这个位置初始化为 0result[i][j] = 0;// k 作为矩阵1 的列,矩阵2 的行for (int k = 0; k < COLS1; k++) {// 矩阵1的i行上的每个值 乘以 矩阵2 j列上的每个值相加之和,就是 i,j 位置的乘积result[i][j] += mat1[i][k] * mat2[k][j];}}}
}int main() {int mat1[ROWS1][COLS1] = {{1, 2, 3}, {4, 5, 6}};int mat2[ROWS2][COLS2] = {{7, 8}, {9, 10}, {11, 12}};int result[ROWS1][COLS2];// 打印原始矩阵1printf("矩阵1:\n");for (int i = 0; i < ROWS1; i++) {for (int j = 0; j < COLS1; j++) {printf("%d ", mat1[i][j]);}printf("\n");}// 打印原始矩阵2printf("矩阵2:\n");for (int i = 0; i < ROWS2; i++) {for (int j = 0; j < COLS2; j++) {printf("%d ", mat2[i][j]);}printf("\n");}// 对矩阵进行相乘matrixMultiply(mat1, mat2, result);// 打印相乘后的结果矩阵printf("相乘后的结果矩阵:\n");for (int i = 0; i < ROWS1; i++) {for (int j = 0; j < COLS2; j++) {printf("%d ", result[i][j]);}printf("\n");}return 0;
}

注意:矩阵的乘法,需要知道,矩阵 Amxn * Bnxt = Cmxt ,矩阵B的行数得等于矩阵A的列数,这样才能相乘

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

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

相关文章

游戏设计模式

单列模式 概念 单例模式是一种创建型设计模式&#xff0c;可以保证一个类只有一个实例&#xff0c;并提供一个访问该实例的全局节点。 优点 可以派生&#xff1a;在单例类的实例构造函数中可以设置以允许子类派生。受控访问&#xff1a;因为单例类封装他的唯一实例&#xf…

prism 10 for Mac v10.1.1.270激活版 医学绘图分析软件

GraphPad Prism 10 for Mac是一款专为科研工作者和数据分析师设计的绘图和数据可视化软件。以下是该软件的一些主要功能&#xff1a; 软件下载&#xff1a;prism 10 for Mac v10.1.1.270激活版 数据整理和导入&#xff1a;GraphPad Prism 10支持从多种数据源导入数据&#xff0…

Linux的bash命令语法

可用点 #!/bin/bash # 文件要以上面开始,.sh结尾的文件不需要# 赋权文件可执行权限 chmod x <fileName># 获取java jar包启动的进程id ps -ef | grep *.jar | grep -v grep | awk {print $2}shell变量 变量命令规则&#xff1a; 只能包含字母、数字、下划线&#xff1…

银行数据仓库体系实践(6)--调度系统

调度系统是数据仓库的重要组成部分&#xff0c;也是每个银行或公司一个基础软件或服务&#xff0c;需要在全行或全公司层面进行规划&#xff0c;在全行层面统一调度工具和规范&#xff0c;由于数据类系统调度作业较多&#xff0c;交易类系统批量优先级高&#xff0c;为不互相影…

uniapp对接微信APP支付返回requestPayment:fail [payment微信:-1]General errors错误-全网总结详解

一、问题描述 uniapp对接微信APP支付&#xff0c;本来是很简单的一件事&#xff0c;后端本来就是好的&#xff0c;只要填一些参数就行了&#xff0c;搞了我一晚上&#xff0c;主要卡在uniapp这边&#xff0c;拉起支付的时候&#xff0c;一直提示以下错误&#xff1a; {"er…

js数组/对象的深拷贝与浅拷贝

文章目录 一、js中的深拷贝和浅拷贝二、浅拷贝1、Object.assign()2、利用es6扩展运算符&#xff08;...&#xff09; 二、深拷贝1、JSON 序列化和反序列化2、js原生代码实现3、使用第三方库lodash等 四、总结 一、js中的深拷贝和浅拷贝 在JS中&#xff0c;深拷贝和浅拷贝是针对…

数学电路与电子工程1(MEE)—— 锁存器和触发器

1 逻辑综合 1.1 DCB/DEC转换器 下图是一个74HC42集成电路的逻辑图&#xff0c;它是一个二进制编码的十进制&#xff08;BCD to Decimal&#xff09;转换器&#xff0c;也称为DCB/DEC转换器。这种类型的IC通常用于将4位二进制数&#xff08;BCD&#xff09;转换为十进制输出。 …

PHP文件相关函数大总结

PHP中与文件相关的函数&#xff1a; 以下示例均以读取example.txt为例&#xff1a; example.txt的内容&#xff1a; this is a txt. 这是一个文件 1 .使用 file_get_contents 读取整个文件内容&#xff1a; $fileContent file_get_contents(example.txt); echo $fileContent…

Flink问题解决及性能调优-【Flink rocksDB读写state大对象导致背压问题调优】

RocksDB是Flink中用于持久化状态的默认后端&#xff0c;它提供了高性能和可靠的状态存储。然而&#xff0c;当处理大型状态并频繁读写时&#xff0c;可能会导致背压问题&#xff0c;因为RocksDB需要从磁盘读取和写入数据&#xff0c;而这可能成为瓶颈。 遇到的问题 Flink开发…

MySql8的简单使用(1.模糊查询 2.group by 分组 having过滤 3.JSON字段的实践)

MySql8的简单使用&#xff08;1.模糊查询 2.group by 分组 having过滤 3.JSON字段的实践&#xff09; 一.like模糊查询、group by 分组 having 过滤 建表语句 create table student(id int PRIMARY KEY,name char(10),age int,sex char(5)); alter table student add height…

【C/C++ 01】初级排序算法

排序算法通常是针对数组或链表进行排序&#xff0c;在C语言中&#xff0c;需要手写排序算法完成对数据的排序&#xff0c;排序规则通常为升序或降序&#xff08;本文默认为升序&#xff09;&#xff0c;在C中&#xff0c;<algorithm>头文件中已经封装了基于快排算法的 st…

记录我的历程

1、2024年1月30号更新 从2024年1月22号开始复更&#xff0c;已添加20篇文章&#xff0c; 前一阶段&#xff1a;排名1502450、原力分2、粉丝3人

PGsql 解析json及json数组

创建测试数据 drop table if exists json_test; create table json_test as select 111 as id, {"nodes":{"1692328028076":{"nodeId":"1692328028076","nodeName":"测试表1","nodeType":"DATACO…

STM32 OV7725摄像头模块识别颜色物体(1)--HSL二值化和腐蚀中心算法,并用串口输出数据

目录 前言 一、摄像头采集数据流程 二、如何将图像显示到电脑上 三、图像二值化 1、什么是RGB? 2、RGB565转RGB888 I、RGB565和RGB888的区别 II、代码 3、RGB转HSL I、什么是HSL II、转换公式 III、代码 3、输出一张摄像头二值化图片 I、原理 II、代码 四、简单的物体识别 1、…

ElasticSearch搜索引擎入门到精通

ES 是基于 Lucene 的全文检索引擎,它会对数据进行分词后保存索引,擅长管理大量的数据,相对于 MySQL 来说不擅长经常更新数据及关联查询。这篇文章就是为了进一步了解一下它,到底是如何做到这么高效的查询的。 在学习其他数据库的时候我们知道索引是一个数据库系统极其重要…

数字图像处理(实践篇)三十六 OpenCV-Python 使用ORB和BFmatcher对两个输入图像的关键点进行匹配实践

目录 一 涉及的函数 二 实践 ORB(Oriented FAST and Rotated BRIEF)是一种特征点检测和描述算法,它结合了FAST关键点检测和BRIEF描述子。ORB算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。 ②

[C++]使用纯opencv部署yolov8旋转框目标检测

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 YOLOv8是一种先进的对象检测算法&#xff0c;它通过单个神经网络实现了快速的物体检测。其中&#xff0c;旋转框检测是YOLOv8的一项重要特性&#xff0c;它可以有效地检测出不同方向和角度的物体。…

git用法总结

以gitee为例&#xff0c;GitHub也可参考本文 创建远程仓库 在自己的gitee主页 创建本地仓库 在文件夹下&#xff0c;右键→git bash here git init添加gitignore vi .gitignoregitignore里的内容根据自己实际情况设置&#xff0c;这里举个例子 # #开头的是注释 # Prer…

Oracle篇—分区索引的重建和管理(第三篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

写静态页面——魅族导航_前端页面练习

0、效果&#xff1a; 1、html代码&#xff1a;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…