给出c语言的三维数组地址计算公式,多维数组 - yedushusheng的个人空间 - OSCHINA - 中文开源技术交流社区...

本文详细介绍了多维数组和广义表的非线性结构特性,包括一维、二维、多维数组的概念及其在内存中的顺序存储方式。讨论了行优先和列优先两种存储策略,并给出了相应的地址计算公式。此外,还提到了矩阵的二维数组描述和压缩存储情况,特别是针对稀疏矩阵的存储优化。
摘要由CSDN通过智能技术生成

多维数组和广义表是一种复杂的非线性结构,它们的逻辑特征是:一个数据元素可能有多个直接前驱和多个直接后继。

多维数组

1、数组(向量)——常用数据类型

一维数组(向量)是存储于计算机的连续存储空间中的多个具有统一类型的数据元素。

同一数组的不同元素通过不同的下标标识。

(a1,a2,…,an)

2、二维数组

二维数组Amn可视为由m个行向量组成的向量,或由n个列向量组成的向量。

3c1aaa36e199aac6782e3afe8147c4fe.png

二维数组中的每个元素aij既属于第i行的行向量,又属于第j列的列向量。

3、多维数组

三维数组Amnp可视为以二维数组为数据元素的向量。四维数组可视为以三维数组为数据元素的向量……

三维数组中的每个元素aijk都属于三个向量。四维数组中的每个元素都属于四个向量……

4、数组的顺序存储方式

由于计算机内存是一维的,多维数组的元素应排成线性序列后存人存储器。  数组一般不做插入和删除操作,即结构中元素个数和元素间关系不变化。一般采用顺序存储方法表示数组。

(1)、行优先顺序

将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。

【例】二维数组Amn的按行优先存储的线性序列为:

a11,a12,…,a1n,a21,a22,…,a2n,……,am1,am2,…,amn

注意:

①  PASCAL和C语言中,数组按行优先顺序存储。

②  行优先顺序推广到多维数组,可规定为先排最右的下标。

(2)、列优先顺序

将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。

【例】二维数组Amn的按列优先存储的线性序列为:

a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn

注意:

①  FORTRAN语言中,数组按列优先顺序存储。

②  列优先顺序推广到多维数组,可规定为先排最左的下标。

5、数组元素的地址计算公式

(1)、按行优先顺序存储的二维数组Amn地址计算公式

LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d

其中:

①  LOC(a11)是开始结点的存放地址(即基地址)

②  d为每个元素所占的存储单元数

③  由地址计算公式可得,数组中任一元素可通过地址公式在相同时间内存取。即顺序存储的数组是随机存取结构。

(2)、按列优先顺序存储的二维数组Amn地址计算公式

LOC(aij)=LOC(a11)+[(j-1)×m+i-1]×d

(3)、按行优先顺序存储的三维数组Amnp地址计算公式

LOC(aijk)=LOC(a111)+[(i-1)×n×p+(j-1)×p+k-1]×d

(4)、下界不为1的二维数组的地址计算公式

①  二维数组A[c1..d1,c2..d2]的地址计算公式:

LOC(aij)=LOC(ac1c2)+[(i-c1)×(d2-c2+1)+j-c2]×d

②  下界为0的二维数组的地址计算公式(C语言中使用)

LOC(aij)=LOC(a00)+[i×(d2+1)+j]×d

注意:

以下讨论的数组存储结构都以C语言下标表示。

矩阵的存储

1、矩阵的二维数组描述

矩阵用二维数组描述时,存储的密度为1。可以对其元素进行随机存取,各种矩阵运算也非常简单。

2、矩阵的压缩存储

矩阵中非零元素呈某种规律分布或者矩阵中出现大量的零元素的情况下,为了节省存储空间,我们可以对这类矩阵进行压缩存储:即为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。

特殊矩阵

稀疏矩阵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值