数组
存储结构
一维数组的存储结构:
对应一维数组,按元素顺序存储到一块地址连续的内存单元中。假设第一个元素a1的存储地址用LOC(ai)表示,每个元素占用k个存储单元,则任一数组元素ai的存储单元LOC(ai)即可由以下公式求出:
LOC(ai)=LOC(a1)+(i-1)x k (2≤i≤n)
该式说明一维数组中任一元素的存储地址可直接计算得到,即一维数组中的任一元素可直接存取,因此,一维数组具有随机存储特性。
二维数组的存储结构(按行优先存放):
假设第一个元素a1,1的存储地址用LOC(a1,1)表示,每个元素占用k个存储单元,则该二维数组中的任一元素ai,j的存储地址可由下式确定:
LOC(ai,j)=LOC(a1,1)+[(i-1) x n+(j-1)] x k
二维数组的存储结构(按列优先存放):
假设第一个元素a1,1的存储地址用LOC(a1,1)表示,每个元素占用k个存储单元,则该二维数组中的任一元素ai,j的存储地址可由下式确定:
LOC(ai,j)=LOC(a1,1)+[(j-1) x m+(i-1)] x k
特殊矩阵
- 对称矩阵:一个n阶方阵A[n][n]中元素满足ai,j=aj,i(0≤i,j≤n-1)
- 上三角矩阵:矩阵下三角部分中的元素均为常数c的n阶方阵
- 下三角矩阵:矩阵下三角部分中的元素均为常数c的n阶方阵
- 对角矩阵:一个n阶方阵A满足其所有非零元素都集中在以主对角线为中心的带状区域中
稀疏矩阵
当一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t非常小时,即s<<t时,称该矩阵为稀疏矩阵。
稀疏矩阵的三元组表示
把稀疏矩阵的三元组线性表按顺序存储结构存储,则称为稀疏矩阵的三元组顺序表,简称为三元租表。三元组顺序表的数据类型声明:
#define M <稀疏矩阵行数>
#define N <稀疏矩阵列数>
#define Maxsize <稀疏矩阵中非零元素最多的个数>
typedef struct{
int r; //行号
int c; //列号
ElemType d; //元素值
} TupNode; //三元组类型
typedef struct{
int rows; //行数
int cols; //列数
int nums; //非零元素个数
TupNode data[Maxsize];
} TSMaxsize; //三元顺序表的类型
稀疏矩阵的十字链表表示
#define M <稀疏矩阵行数>
#define N <稀疏矩阵列数>
#define Max((M)>(N)?(M):(N)) //矩阵行列较大者
typedef struct{
int row; //行数或行号
int col; //列数或列号
struct mtxn * right,*down; //行,列指针
union{
ElemType value; //非零元素值
struct mtxn *link; //指向下一个头结点
}tag;
}MaxNode; //十字链表的结点类型
广义表
定义
广义表是线性表的推广,是有限个元素的序列,其巡逻结构采用括号表示法如下:
GL=(a1,a2,……ai,……,an)
其中n表示广义表的长度,即广义表中所含元素的个数,n≥0。若n=0,称为空表。ai为广义表的第i个元素,如果ai属于原子类型(原子类型的值是不可分解的,如整型,实型,字符型等),称为广义表GL的原子;如果ai又是一个广义表,称为广义表GL的子表。
广义表具有的特性:
- 广义表中的数据元素是有相对次序的
- 广义表的长度定义为最外层包含元素的个数
- 广义表的深度定义为所含括弧的重数,其中原子的深度为0,空表的深度为1
- 广义表可以共享,一个广义表可以被其他广义表共享,这种共享广义表称为再人表
- 广义表可以是一个递归的表,一个广义表可以是自己的子表,这种广义表称为递归表。递归表的深度是无穷值,而长度是有限值。
存储结构
广义表是一种递归的数据类型,因此很难为每个广义表分配固定大小的匹配空间,所以其存储结构只好采用链式存储结构。
广义表结点类型GLNode声明:
typedef struc{
int tag;
union{
ElemType data;
struct lnode * sublist;
} val;
struct lnode *link;
} GLNode;