广义表的定义
广义表一般定义为GL=(a1,a2,a3…,an),n>=0。
其中GL是广义表的名称,n是广义表的长度。在线性表中,ai是单元素。在广义表中,ai可以是单元素也可以是广义表,它们分别称为广义表的原子和子表。显然,广义表的定义时递归的。
一般用大写字母表示广义表的子表,用小写字母表述广义表的原子。当广义表GL非空时,第一个元素a1为GL的表头,其余元素组成的子表(a2,…,an)称为GL的表尾。
(1)A=() A是一个空表,其长度为0
(2)B=(a)B的长度为1,元素为原子,已经退化为一般的线性表
(3)C=(e,(a,b,c)) C的长度为2,第一个元素为原子,第二个元素为子表
(4)D=(A,B,C) D的长度为3
(5)E=(a,E) 这是一个递归的广义表,它的长度为2,是一个无限深度的广义表,E=(a,(a,(a,…)))
如果用圆表示原子,用正方形表示广义表,则可以用图形表示广义表。如图:
广义表的存储结构
由于广义表中的元素既可以是原子,也可以是广义表,两者结构不同、大小不一,且难以顺序结构存储,因此通常采用链式结构表示广义表。根据不同信息存储方式,广义表的链式存储通常可以采取两种不同的方式。无乱采取什么方式,节点必须设计成两种类型:表结点和原子节点。
1.层次结构
层次结构考虑存储广义表的层次信息。在层次结构的链式存储中,表结点设有两个指针域(next,down)。next指向同一层的下一个元素,down指向下一层子表的第一个元素;原子节点不存在下一层次,因此只有一个next指针域指向同一层的下一个元素。两者用1和0来区分。
2.表头表尾结构
表头表尾结构考虑存储广义表的表头和表尾信息。在表头表尾结构中,表结点设有两个指针域(head,tail),head指针指向广义表的表头元素,tail指针指向广义表的表尾元素;原子节点不设指针域,只存储元素值。两者用标志位1和0区别。