目录
数组
数组的类型定义
数组是由相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受n(n>=1)个线性关系的约束,每个元素在n个线性关系中的序号i1,i2,……,i3称为该元素的下标,并通过下标访问该数据元素。数组可以看作线性表的推广,一维数组可以看作一个线性表,二维数组可以看成数据元素是线性表的线性表。
在C语言中,一个二维数组类型可以定义为其分量类型为一维数组类型的一维数组类型,即:
typedef ElemType Array2[m][n]
等价于
typedef ElemType Array1[n]
typedef Array1 Array2[m]
因此,一个n维数组类型可以定义为其数据元素为n-1维数组类型的一维数组类型。
抽象数据类型数组定义:
ADT Array
{
数据对象:ji=0,...bi-1,i=1,2...n,
D={aj1j2……jn|n(>0)称为数组的维数,bi是数组第i维的长度,ji是数组元素的第i维下标,aj1j2……jn∈ElemSet}
数据关系: R={R1,R.., Rn}
Ri={<aj1……j1……jn,aj1……j1+1……jn >|
0≤jk≤bk-1,1≤k≤n且k!=i,
0≤ji≤bi-2,
aj1...j1...jn,aj1...j1+1...jn∈Di=2 L n}
基本操作:
InitArray (&A,n, boundi,.., boundn)
操作结果:若维数n和各维长度合法,则构造相应的数组A,并返回OK。
DestroyArray (&A)
操作结果:销毁数组A。
Value (A, &e, indexl, ... indexn)
初始条件: A是n维数组,e为元素变量,随后是n个下标值。
操作结果:若各下标不越界,则e赋值为所指定的A的元素值,并返回OK。Assign (&A,e, indexl, ... indexn)
初始条件: A是n维数组,e为元素变量,随后是n个下标值。
操作结果:若下标不越界,则将e的值赋给所指定的A的元素,并返回OK。
} ADT Array
数组的顺序存储
由于存储单元是一维的结构,而数组可能是多维的结构。因此用一组连续的存储单元存放数组元素由次序约定问题。对于二维数组就有了两种存储方式,一种是以列序为主序的存储方式,一种是行序为主序的存储方式。
计算数组a[i][j]的存储位置(数组从a[0][0]开始):
设每个元素占有m个字节,1>以行序为主序:基地址+m*(i*j+j);2>以列序为主序:基地址+m*(j*n+j)。
特殊矩阵的压缩矩阵
如果值相同的元素或者零元素在矩阵中分布有一定的规律特殊矩阵主要包括:对称矩阵,三角矩阵和对角矩阵等。
1.对称矩阵
若n阶矩阵A中的元素满足性质:aij=aji(1≤i,j≤n),则称为n阶对称矩阵。
对于对称矩阵,可以为每一对对称元素分配一个存储空间,则可将n^2个元素压缩存储到n(n+ 1)2个元素的空间中。
上三角:k=i*(i-1)/2+j-1 (i>=j)
下三角:k=j*(j-1)/2+i-1 (j>i)
2.三角矩阵
三角矩阵是以对角线划分,三角矩阵有上三角矩阵和下三角矩阵两种。上三角矩阵是指矩阵下三角(不包括对角线)中的元均为常数c或0的n阶矩阵,下三角矩阵 与之相反。对三角矩阵进行压缩存储时,除了和对称矩阵一样,只存储其上(下)三角中的元素之外,再加一个存储常数c的存储空间即可。
上三角矩阵:k=(i-1)(2*n-i+2)/2+(j-i) (i<=j)
k=n*(n+1)/2 (i>j)
下三角矩阵:k=i*(i-1)/2+j-1 (i>=j)
k=n*(n+1)/2 (i<j)
3.对角矩阵
对角矩阵所有的非零,元都集中在以对角线为中心的带状区域中,即除了对角线上和直接在对角线上、下方若干条与对角线平行的线上的元之外,所有其他的元素皆为零。
广义表
广义表的定义
广义表是线性表的推广,也成为列表。广义表一般记为:LS=(a1,a2,……,an)。
LS是广义表的名称,n是其长度。在线性表的定义中,ai(1<=i<=n)只限于是单个元素。而在广义表的定义中,ai可以是单个元素,也可以是广义表,分别称为广义表LS的原子和子表。通常,用大写字母表示广义表的名称,用小写字母表示原子。表头可以是原子也可以是子表。
下面为了更好的理解,以下是一些广义表的例子:
1>B3=(())—— 有 1个元素,但该元素为空,是空表,长度为1。
2>A=()——A是一个空表,其长度为0。
3>B=(e) ——B只有一个原子e,其长度为1。
4> C= (a, (b,c, d))——C的长度为2, 两个元素分别为原子a和子表(b,c,d),表头是a,表尾是((b,e,d))。
5>D=(A,B,C)——D的长度为3, 3个元素都是广义表。
6>E=(a, E)——这是一 个递归的表,其长度为2。E相当与一个无限的广义表E=(a,(a,(a,...)))。
广义表的性质
1>广义表中的数据元素有相对次序; -个直接前驱和一个直接后继。
2>广义表的长度定义为最外层所包含元素的个数;如: C=(a, (b, d)) 是长度为2的广义表。
3>广义表的深度定义为该广义表展开后所含括号的重数
A=(b, 0的深度为1, B=(A a)的深度为2, C=(f B,川的深度为3。注意: "原子” 的深度为0; "空表" 的深度为1
4>广义表可以为其他广义表共享;如:广义表B就共享表A.在B中不必列出A的值,而是通过名称来引用,B= (A) 。
5>广义表可以是一个递归的表。如: F=(a, F)=(a, (a, (a, ...)))注意:递归表的深度是无穷值,长度是有限值。
6>广义表是多层次结构,广义表的元素可以是单元素,也可以是子表,而子表的元素还可以是子表
广义表的基本运算
1>求表头GetHead(L): 非空广义表的第一个元素可以是一个单元素,也可以是一个子表
2>求表尾GetTail(L): 非空广义表除去表头元素以外其它元素所构成的表。表尾一定是一个表