c++数据结构:广义表

广义表(lists):是一种非连续性的数据结构,是 线性表 的一种推广。

广义表一般记作:LS=(a1,a2,a3,...,an)

  • n:是广义表的长度
  • ai 可以是一个元素(原子),也可以是一个广义表(子表)
  • 第一个元素a1为表头(Head),可以是原子,可以是子表
  • 除第一个元素以外所构成的表为表尾(Tail),表尾一定是个表

c++数据结构:广义表_第1张图片

广义表的性质: 

  1. 列表元素可以是子表,子表的元素也可以是子表
  2. 列表可以为其他列表所共享
  3. 列表可以是一个递归的表

广义表的深度计算:

计算方式为:广义表展开后括号的重数。 

  • “空表”的深度为1
  • 原子的深度为0

c++数据结构:广义表_第2张图片

广义表结构示意图:

可以理解为树形结构:节点可以为两种情况(原子和子表) 

c++数据结构:广义表_第3张图片

c++数据结构:广义表_第4张图片


 广义表的存储结构:

由于有两种不同的结构:一种为原子节点,一种为表节点

第一种结构:

c++数据结构:广义表_第5张图片

enum elemtag{ATOM,LIST};//枚举类型:ATOM=0代表原子,LIST=1代表子表
template
class lists_node
{
private:
	elemtag tag;//判断原子和子表 标识
	union {
		T atom;//原子节点的值
		struct 
		{
			lists_node* hp;//代表子表的表头
			lists_node* tp;//代表子表的表尾
		}ptr;//子表
	};
};

 union 共用体,因为同一时间此节点不是原子节点就是子表节点,当表示原子节点时,就使用 atom 变量;反之则使用 ptr 结构体。

 例如:

c++数据结构:广义表_第6张图片

 

c++数据结构:广义表_第7张图片

 第二种结构:

c++数据结构:广义表_第8张图片

 在原子中,增加了tp,来记录下一个元素节点

enum elemtag { ATOM, LIST };//枚举类型:ATOM=0代表原子,LIST=1代表子表
template
class lists_node
{
private:
	elemtag tag;//判断原子和子表 标识
	union {
		T atom;//原子节点的值
        lists_node* hp;//代表子表的表头
	};
    lists_node* tp;//代表同层下一个元素节点
};

c++数据结构:广义表_第9张图片

c++数据结构:广义表_第10张图片

 

 

你可能感兴趣的:(数据结构,数据结构)