数组-数据结构

279 阅读3分钟

一.数组的特点与定义

1.特点

  1. 数组(Arry)是一种线性表数据结构,它用一组连续的内存空间,来存储数据类型相同的元素。

  2. 每个元素都有一个下标,可以用下标访问该数组元素.

  3. 数组可以看作线性表的推广,但是其元素本身又可以是某种结构的数据(比如:栈,链表,队列),不过存储的数据必须为同一数据类型.
    例如:在二维数组中,数组的每一行可以用栈,队列等数据结构存储数据,然后将数组的每一行看作一个元素存储到一维数组中去.

  4. 数组一旦被定义,它存储的数据元素的多少就被确定,不能进行动态分配,因此除了结构的初始化和销毁之外,只有存取元素和修改元素的操作

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)(存储常数)