广义表是线性表的推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构
知识点
定义
广义表通常记作:
Ls=( a1,a2,…,ai,…,an)。
Ls是广义表的名字,n为它的长度。
若ai是广义表,则称它为Ls的子表。
一个表展开后所含括号的层数称为广义表的深度
注:
广义表通常用圆括号括起来,用逗号分隔其中的元素。
为了区分原子和广义表,书写时用大写字母表示广义表,用小写字母表示原子。广义表中存储的单个元素称为 “原子”,而存储的广义表称为 “子表”。
若广义表Ls非空(n≥1),则al是LS的表头(head),其余元素组成的表(a1,a2,…,an)称为Ls的表尾(tail)。
广义表是递归定义的
广义表性质
-
广义表的元素可以是子表,而子表又可以含有子表,因此广义表是一个多层次结构的表,它可以用图来形象地表示。
-
广义表具有递归和共享的性质,
D表是共享的表,在表D中可以不必列出子表的值,而是通过子表的名字来引用。
广义表基本运算,考点
只有两个特殊运算:取表头head(Ls)和取表尾tail(Ls)。任何一个非空的广义表其表头可能是原子,也可能是子表,而其表尾一定是子表。
如:广义表中 LS={1,{1,2,3},5} 中,表头为原子 1,表尾为子表 {1,2,3} 和原子 5 构成的广义表,即 {{1,2,3},5}。
在广义表 LS = {1} 中,表头为原子 1 ,但由于广义表中无表尾元素,因此该表的表尾是一个空表,用 {} 表示。
广义表的存储结构
结点结构:
tag | data/slink | link |
---|
(1)tag标志位,tag=1,该结点是子表,第二个域为slink,用以存放子表的地址;当tag=0时,该结点是原子结点,第二个域为data,用以存放元素值。
(2)link域是用来存放与本元素同一层的下一个元素对应结点的地址,当该元素是所在层的最后一个元素时,link的值为NULL。
小结
栈和队列都是典型的线性结构,结构中数据元素都是不能分解的非结构的原子类型。它们的逻辑特征是:每个数据元素至多有一个直接前趋和直接后续。而多维数组和广义表是一种复杂的非线性结构,它们的逻辑特征是:一个数据元素可能有多个直接前趋和直接后继。