一.数组的特点与定义
1.特点
-
数组(Arry)是一种线性表数据结构,它用一组连续的内存空间,来存储数据类型相同的元素。
-
每个元素都有一个下标,可以用下标访问该数组元素.
-
数组可以看作线性表的推广,但是其元素本身又可以是某种结构的数据(比如:栈,链表,队列),不过存储的数据必须为同一数据类型.
例如:在二维数组中,数组的每一行可以用栈,队列等数据结构存储数据,然后将数组的每一行看作一个元素存储到一维数组中去. -
数组一旦被定义,它存储的数据元素的多少就被确定,不能进行动态分配,因此除了结构的初始化和销毁之外,只有存取元素和修改元素的操作
2.数组类型的定义
- 一维数组:typedef ElemType Arry1[m]
- 二维数组:typedef ElemType Arry2[m][n]
通过特点3我们可知,二维数组的定义等价于
typedef ElemType Arry1[m]
typedef Arry1 Arry2[n]
二.数组的顺序存储结构
1.存储方式
(1)一维数组:采用一组连续的存储单元进行存储。
(2)n维数组:在c语言中,采用以行序为主的一组连续的存储单元进行存储。
比如:二维数组a[1][1]中,存储顺序为a[0][0],a[0][1],a[1][0],a[1][1].
2.计算数据元素存储的位置
假设每个数据元素占L个存储单元,则二维数组A[m][n]中任意一个元素a[i][j]的位置是:
LOC(i,j)=LOC(0,0)+(ni+j)L
推广到一般,在n维数组中:
三.特殊矩阵的压缩
压缩的意义:节省存储空间,为多个相同的值分配同一个存储空间,对零元不分配空间
压缩的方式:用一维数组表A[K],(K=n*(n+1)/2),作为n阶矩阵Aij的存储结构,使一维数组A[K]与n阶矩阵Aij存在一一对应的关系.
在对称矩阵中一维数组的下标由0到(n*(n+1)/2)-1,三角矩阵中一维数组的下标由0到n*(n+1)/2。
1.对称矩阵
- 对称矩阵的性质:Aij=Aji i>=1,j<=n
- 对于对称矩阵,每一对元素分配一个存储空间,将nn个元素压缩到n(n+1)/2个元的空间中,以行序为主序存储其下三角的元
- 一维数组下标K与矩阵元Aij之间的关系:当i>=j时K=i*(i-1)/2+j-1;当i<j时k=j(j-1)/2+i-1
当K=0时 i=1,j=1 当K=1时 i=2,j=1-----
2.三角矩阵
以下三角矩阵为例,上三角(不包括对角线)中的元均为常数c或0,存储其下三角中的元之外,还要用同一个内存存储常数c
用一维数组A[K],k=n*(n+1)/2,存储矩阵Aij
一维数组下标K与矩阵元Aij之间的关系:
下三角
K=i(i-1)/2+j-1(i>=j)
K=n(n+1)/2(i<j)(存储常数)
上三角
K=((i-1)(2n-i+2)/2)+(j-i)(i<=j)
K=n(n+1)/2(i>j)(存储常数)