目录
一、多维数组
多维数组是一维数组的扩展,即数组的数组。例如,二维数组可以看作是一维数组作为数据元素构成的一维数组,三维数组可以看作二维数组作为元素构成的一维数组。多维数组在计算机中是一段连续的存储单元,适用于随机查找。一旦多维数组被定义,它的维数和维界就不再改变,因此除了数组的初始化和销毁之外,数组的操作主要涉及获得特定位置的元素值或者修改特定位置的元素值
多维数组:一般用顺序存储的方式表示数组。
常用方式有:1)行优先顺序,将数组元素按行向量排列;
列优先顺序,将数组元素按列向量排列。
计算地址的函数:LOC(Aij)=LOC(Ac1c2)+((i-c1)*(d2-c2+1)+j-c2)*d
矩阵的压缩存储:为多个非零元素分配一个存储空间;对零元素不分配存储空间。
1.1 对称矩阵
在一个n阶的方阵A中,元素满足Aij=Aji 0<=i,j<=n-1;称为对称矩阵。
元素的总数为:n(n+1)/2;
设:I=i或j中大的一个数;J=i或j中小的一个数;
则:k=I*(I+1)/2+J;
地址计算:LOC(Aij)=LOC(sa[k])=LOC(sa[0])+k*d= LOC(sa[0])+ (I*(I+1)/2+J )*d
1.2 三角矩阵
以主对角线划分,三角矩阵有上三角和下三角;上三角的主对角线下元素均为常数c;下三角的主对角线上元素均为常数c。
元素总数为:(n(n+1)/2)+1;
以行优先顺序存放的Aij与SA[k]的关系:
上三角阵:k=i*(2n-i+1)/2+j-i;
下三角阵:k=i*(i+1)/2+j;
1.3 对角矩阵
所有的非零元素集中在以主对角线为中心的带状区域,相邻两侧元素均为零。|i-j|>(k-1)/2
以行优先顺序存放的Aij与SA[k]的关系:k=2i+j;
1.4 稀疏矩阵
当矩阵A中有非零元素S个,且S远小于元素总数时,称为稀疏矩阵。
对其压缩的方法有顺序存储和链式存储。
1.5 三元组表
将表示稀疏矩阵的非零元素的三元组(行号、列号、值)按行或列优先的顺序排列得到的一个结点均是三元组的线性表,将该表的线性存储结构称为三元组表。其类型定义:
#define maxsize 10000
typedef int datatype;
typedef struct{
int i,j;
datatype v;
}trituplenode;
typedef struct{
trituplenode data[maxsize];
int m,n,t;
}tritupletable;
1.6 带行表的三元组表
在按行优先存储的三元组表中加入一个行表记录每行的非零元素在三元组表中的起始位置。类型定义:
#define maxrow 100
typedef struct{
tritulpenode data[maxsize];
int rowtab[maxrow];
int m, n, t;
}rtritulpetable;
二、广义表
广义表是一种复杂的非线性结构,一个元素可能有多个直接前趋和多个直接后继。广义表的数据元素构成线性表,而数据元素本身又是一个线性结构。广义表在逻辑上表示为:一个元素可能有多个直接前驱和多个直接后继,因此是一种非线性结构
是线性表的推广,广义表是n个元素的有限序列,元素可以是原子或一个广义表,记为LS。
若元素是广义表称它为LS的子表。若广义表非空,则第一个元素称表头,其余元素称表尾。
表的深度是指表展开后所含括号的层数。
把与树对应的广义表称为纯表,它限制了表中成分的共享和递归;
允许结点共享的表称为再入表;
允许递归的表称为递归表;
相互关系:线性表∈纯表∈再入表∈递归表;
广义表的特殊运算:1)取表头head(LS);2)取表尾tail(LS);