目录
一、广义表的定义
1.1定义
广义表是n>=0个元素a0,a1,....,a(n-1)的有限序列,其中每一个a(i)或者是原子,或者是一个广义表。(拓宽了的线性表)
1.2相关概念
①记法:LS=(a1,a2,..,a(n))
LS为表名,n为表的长度,每一个a(i)为表的元素。
(一般用大写字母表示广义表小写字母表示原子)
②表头:LS非空的第一个元素a(i),记作head(LS)=a1
(表头可以是原子,也可以是子表)
③表尾:除表头之外的其他元素组成的表,记作tail(LS)=(a2,...,a(n))
(表尾不是最后一个元素,而是一个子表)
例:
①A=() ——>空表,长度为0
②B=(()) ——>长度为1,表头、表尾均为()
③C=(a,(b,c)) ——>长度为2,由原子a和子表(b,c)构成;表头为a,表尾为((b,c)) (由(b,c)这个广义表组成的一个广义表)
④D=(x,y,z) ——>长度为3,每一项都是原子;表头为x,表尾为(y,z)
⑤E=(C,D) ——>长度为2,每一项都是子表;表头为C,表尾为(D) (共享广义表)
⑥F=(a,F) ——>长度为2,第一项为原子,第二项为它本身;表头为a,表尾为(F) (递归广义表)F=(a1(a1(a1,....)))
1.3性质
①广义表中的数据元素有相对次序;一个直接前驱和一个直接后继
②广义表的长度定义为最外层所包含元素的个数
如:C=(a,(b,c))是长度为2的广义表
③广义表的深度定义为该广义表展开后所含括号的重数
如:A=(b,c)的深度为1,B=(A,d)的深度为2,C=(f,B,h)的深度为3
注:原子的深度为0,空表的深度为1。
④广义表可以为其他广义表共享,如上述例子B就共享A,B=(A)
⑤广义表可以是一个递归的表。如上述例子F=(a,F)=(a1(a1(a1,...)))
注:递归表的深度是无穷值,长度时有限值。
⑥广义表是多层次结构,元素可以是单元素,也可以是子表,而子表的元素还可以是子表。
可以用图形象地表示:
1.4基本运算
①求表头GetHead(L) 表头可以是一个单原子,也可以是一个子表
②求表尾GetTail(L) 表尾一定是一个表
二、广义表的存储结构
2.1头尾链表的存储结构
①表结点:标志域、指示表头的指针域、指示表尾的指针域。
tag=1 hp tp
②原子结点:标志域和值域
tag=0 atom
形式定义:
typedef enum{ATOM,LIST} ElemTag; //ATOM==0:原子;LIST==1:子表
typedef struct GLNode{
ElemTag tag; //公共部分,用于区分原子结点和表结点
union //原子结点和表结点的联合部分
{
AtomType atom; //atom是原子结点的值域
struct{struct GLNode*hp,*tp;}ptr; //ptr是表结点的指针域,ptr.hp和ptr.tp分别指向表头和表尾
};
}*GList; //广义表类型
2.2扩展线性链表的存储结构
在这种结构中,无论是表结点还是原子结点,均由3个域组成
①表结点
tag=1 hp tp
②原子结点
tag=0 atom tp