C语言第9章zk.pptVIP

  • 4
  • 0
  • 约1.19万字
  • 约 45页
  • 2018-01-08 发布于河南
  • 举报
C语言第9章zk

9.3 数组 9.3.1 数组的概念 数组是大家都已经很熟悉的一种数据类型,几乎所有高级语言程序设计中都设定了数组类型。在此,我们仅简单地讨论数组的逻辑结构及其在计算机内的存储方式。 1.一维数组 一维数组可以看成是一个线性表或一个向量(第8章中已经介绍),它在计算机内是存放在一块连续的存储单元中,适合于随机查找。这在第8章的线性表的顺序存储结构中已经介绍。 2.二维数组 二维数组可以看成是向量的推广。例如,设A是一个有m行n列的二维数组,则A可以表示为: 在此,可以将二维数组A看成是由m个行向量[X0,X1,…,Xm-1]T组成,其中,Xi=( ai0, ai1, …,ain-1), 0≤i≤m-1;也可以将二维数组A看成是由n个列向量[y0, y1, …,yn-1]组成,其中 yi=(ai0, a1i, …,am-1i),0≤i≤n-1。由此可知二维数组中的每一个元素最多可有两个直接前驱和两个直接后继(边界除外),故是一种典型的非线性结构。 9.3.2 数组在计算机内的存储 怎样将多维数组中的元素存入到计算机内存中呢?由于计算机内存结构是一维的(线性的),因此,用一维内存存放多维数组就必须按某种次序将数组元素排成一个线性序列,然后将这个线性序列顺序存放在存储器中。 9.3.3 行优先顺序 1.存放规则 行优先顺序也称为低下标优先存储,或左边下标优先于右边下标。具体实现时,按行号从小到大的顺序,先将第一行中元素按列号从小到大全部存放好,再存放第二行元素,第三行元素,依此类推…… 在BASIC语言、PASCAL语言、C/C++语言等高级语言程序设计中,都是按行优先顺序存放的。例如,对刚才的Am×n二维数组,可用如下形式存放到内存中:a00,a01,…,a0n-1,a10,a11,...,a1 n-1,…,am-1 0 ,am-1 1,…,am-1 n-1。即二维数组按行优先存放到内存后,变成了一个线性序列(线性表)。 因此,可以得出多维数组按行优先顺序存放到内存的规律:最左边下标变化最慢,最右边下标变化最快,右边下标变化一遍,与之相邻的左边下标才变化一次。因此,在算法中,若用循环语句的嵌套来实现按行优先顺序存放,最左边下标可以看成是最外层循环,最右边下标可以看成是最内层循环。 2.地址计算 由于多维数组在内存中排列成一个线性序列,因此,若知道第一个元素的内存地址,如何求得其他元素的内存地址呢?我们可以将它们的地址排列看成是一个等差数列,假设每个元素占d个字节,元素aij 的存储地址应为第一个元素的地址加上排在aij 前面的元素所占用的单元地址数,而aij 的前面有i行(0~i-1)共i×n个元素,而本行前面又有j个元素,故aij的前面一共有i×n+j个元素,设a00的内存地址为LOC(a00),则aij的内存地址按等差数列计算为LOC(aij)=LOC(a00)+(i×n+j)×d。同理,三维数组Am×n×p按行优先顺序存放的地址计算公式为:LOC(aijk)=LOC(a000)+(i×n×p+j×p+k)×d。 9.3.4 列优先顺序 1.存放规则 列优先顺序也称为高下标优先存储,或右边下标优先于左边下标。具体实现时,按列号从小到大的顺序,先将第一列中的元素按行号从小到大的顺序全部存放好,再存放第二列元素,第三列元素,依此类推…… 在FORTRAN语言程序设计中,数组是按列优先顺序存放的。例如,对前面提到的Am×n二维数组,可以按如下的形式存放到内存中:a00,a10…,am-10,a01,a11,…,am-1 1,…,a0 m-1,a1m-1,...,am-1 n-1 。 因此,二维数组按列优先顺序存放到内存后,也变成了一个线性序列(线性表)。 因此,可以得出多维数组按列优先顺序存放到内存的规律:最右边下标变化最慢,最左边下标变化最快,左边下标变化一遍,与之相邻的右边下标才变化一次。因此,在算法中,若用循环语句的嵌套来实现按列优先顺序存放,最右边下标可以看成是最外层循环,最左边下标可以看成是最内层循环。 2.地址计算 同样与行优先顺序存放类似,若知道第一个元素的内存地址,则同样可以求得按列优先顺序存放的某一元素aij的地址。 对二维数组Am×n有:LOC(aij)=LOC(a00)+(j×m+i)×d 对三维数组Am×n×p有:LOC(aijk)=LOC(a000)+(k×m×n+j×m+i)×d 9.4 特殊矩阵的压缩存储 矩阵是一个二维数组,它是很多科学与工程计算问题中研究的数学对象。矩阵可以用行优先顺序或列优先顺序的方法顺序存放到内存中,但是,当矩阵的阶数很大时,将会占用较多的存储单元。而当里面的元素分布呈现某种规律时,这时,从节约存储单元出发,可考虑若干元素共用一个存储单元,即进行压缩

文档评论(0)

1亿VIP精品文档

相关文档