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

文章目录

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

数组

数组的概述

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

数组的图示

一维数组

二维数组
  • 二维数组可以看成一个表格,下边就是一个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.mzph.cn/news/655452.shtml

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

相关文章

代码随想录算法训练营第三十三天|860. 柠檬水找零

860. 柠檬水找零 public static boolean lemonadeChange(int[] bills) {if (bills.length 0) {return true;}if (bills[0] > 5) {return false;}int fiveNum 0;int tenNum 0;for (int i 0; i < bills.length; i) {if (bills[i] 5) {fiveNum;continue;}if (bills[i]…

导入表注入(iathook)

头文件&#xff08;hookMain.h&#xff09;内容 #pragma once #include<Windows.h>DWORD* g_iatAddr NULL; DWORD* g_unHookAddr NULL;BOOL InstallHook(); //安装钩子 BOOL UninstallHook(); //卸载钩子 DWORD* GetIatAddr(const char* dllName, const char* dllFunc…

【webrtc】m98 : vs2019 直接构建webrtc及unitest工程 1

还是换用了vs2019 构建官方的m98代码打开gn生成的sln 工程 随便点击一个工程turnserver 构建,结果会触发全部构建turnserver构建日志 :构建了整个webrtc ts(1665,8): note: result_of<webrtc::TimeDelta ((lambda at ../../video/adaptation/overuse_frame_detector.cc:55…

C#设置程序开机启动

1&#xff1a;获取当前用户&#xff1a; System.Security.Principal.WindowsIdentity identity System.Security.Principal.WindowsIdentity.GetCurrent();System.Security.Principal.WindowsPrincipal principal new System.Security.Principal.WindowsPrincipal(identity);…

C# 使用WMI监听进程的启动和关闭

写在前面 Windows Management Instrumentation&#xff08;WMI&#xff09;是用于管理基于 Windows 操作系统的数据和操作的基础结构。具体的API可以查看 WMI编程手册。 WMIC 是WMI的命令行管理工具&#xff0c;使用 WMIC&#xff0c;不但可以管理本地计算机&#xff0c;还可…

粒子群算法求解港口泊位调度问题(MATLAB代码)

粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;它通过模拟鸟群或鱼群的行为来寻找最优解。在泊位调度问题中&#xff0c;目标是最小化所有船只在港时间的总和&#xff0c;而PSO算法可以帮助我们找到一…

LarkXR功能更新:引入浏览器原生H265支持

Paraverse平行云自主研发的LarkXR&#xff0c;在CloudXR领域实现了重大突破&#xff0c;为XR云平台的商业化和技术进步树立了新标准。LarkXR通过其分钟级部署大规模云端资源和对所有主流XR引擎的高适配性&#xff0c;成功地解决了Cloud XR商业化过程中的多项挑战。这一创新不仅…

Java把列表数据导出为PDF文件,同时加上PDF水印

一、实现效果 二、遇到的问题 实现导出PDF主体代码参考&#xff1a;Java纯代码实现导出PDF功能&#xff0c;下图是原作者实现的效果 导出报错Font STSong-Light with UniGB-UCS2-H is not recognized.。参考&#xff1a;itext 生成 PDF(五) 使用外部字体 网上都是说jar包的版本…

FastBee开源物联网平台2.0开源版发布啦!!!

一、项目介绍 物美智能(wumei-smart)更名为蜂信物联(FastBee)。 FastBee开源物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot&#xff1b;前端采用…

成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘

成功解决AttributeError: ‘str’ object has no attribute ‘decode’. &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;报错分析及解决方案&#x1f333;&#x1f333;参考文章&#x1f333;&#x1f333;结尾&#x1f333; &#x1f333;引…

Git安装,Git镜像,Git已安装但无法使用解决经验

git下载地址&#xff1a; Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像&#xff08;推荐&#xff0c;镜…

算法沉淀——前缀和(leetcode真题剖析)

算法沉淀——前缀和 01.一维前缀和02.二维前缀和03.寻找数组的中心下标04.除自身以外数组的乘积05.和为 K 的子数组06.和可被 K 整除的子数组07.连续数组08.矩阵区域和 前缀和算法是一种用于高效计算数组或序列中某个范围内元素之和的技巧。它通过预先计算数组的前缀和&#xf…

Redhat 8.4 一键安装 Oracle 11GR2 单机版

Oracle 一键安装脚本&#xff0c;演示 Redhat 8.4 一键安装 Oracle 11GR2 单机版过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 脚本…

宝塔控制面板配置SSL证书实现网站HTTPS

宝塔安装SSL证书提前申请好SSL证书&#xff0c;如果还没有&#xff0c;先去Gworg里面申请&#xff0c;一般几分钟就可以下来&#xff0c;申请地址&#xff1a;首页-Gworg官方店-淘宝网 一、登录邮箱下载&#xff1a;Gworg证书文件目录 &#xff0c;都会有以下五个文件夹。宝塔…

ROS学习笔记11——ROS中的重名问题

一、ros功能包重名——ros工作空间覆盖 功能包重名时&#xff0c;会按照 ROS_PACKAGE_PATH 查找&#xff0c;在前的会优先执行。ROS 会解析 .bashrc 文件&#xff0c;并生成 ROS_PACKAGE_PATH ROS包路径&#xff0c;即调用功能包的顺序&#xff0c;该变量中按照 .bashrc 中配置…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(四十六)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

Blender教程(基础)-内插面、分离、环切、倒角-08

一、内插面 菜单位置如下图位置。 单击需要处理的面&#xff0c;出现一个黄色的圈。 1、菜单选中内插 鼠标悬停在黄色圈内单击左键可以来回实现内插&#xff0c;但是发现并不好操作。 2、快捷键内插 在选中需要操作的面之后&#xff0c;鼠标移动到外面&#xff0c;键盘在英…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令&#xff1a; cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注&#xff1a;cp -r 会把所有source当作普通文件&#xff08;regular文件&#xff09;&#x…

【CMU-自主导航与规划】M-TARE planner 配置与运行

M-TARE docker M-TARE 源码 一、依赖 Docker, Docker Compose, NVIDIA Container Toolkit, Nvidia GPU Driver&#xff08;需要至少2个&#xff0c;带Nvidia GPU&#xff09; 1.1 Docker docker -v #查询版本1.2 Docker Compose docker compose version1.3 …

Python 数据分析实战——社交游戏的用户流失?酒卷隆治_案例2

# 什么样的顾客会选择离开 # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&#xff09; user_id…