数据结构资料(六)——数组和广义表

数组

存储结构

一维数组的存储结构:
对应一维数组,按元素顺序存储到一块地址连续的内存单元中。假设第一个元素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的子表。

广义表具有的特性:

  1. 广义表中的数据元素是有相对次序的
  2. 广义表的长度定义为最外层包含元素的个数
  3. 广义表的深度定义为所含括弧的重数,其中原子的深度为0,空表的深度为1
  4. 广义表可以共享,一个广义表可以被其他广义表共享,这种共享广义表称为再人表
  5. 广义表可以是一个递归的表,一个广义表可以是自己的子表,这种广义表称为递归表。递归表的深度是无穷值,而长度是有限值。

存储结构

广义表是一种递归的数据类型,因此很难为每个广义表分配固定大小的匹配空间,所以其存储结构只好采用链式存储结构。
广义表结点类型GLNode声明:

typedef struc{
	int tag;
	union{
		ElemType data;
		struct lnode * sublist;
	} val;
	struct lnode *link;
} GLNode;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FFFPAG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值