廣義表
定義:廣義表是線性表的推廣也稱為列表,廣義表一般記作\(LS=(a_{1},a_{2},,,,a_{n})\)
LS是廣義表\((a_{1},a_{2},,,,a_{n})\)的名稱,n是其長度
在廣義表的定義中,\(a_{i}\)可以是單個元素也可以是廣義表分別稱為廣義表的原子和子表,習慣上用大寫字母表示廣義表的名稱,用小寫字母表示原子
重要結論:
- 廣義表的元素可以是子表,而子表的元素還可以是子表
- 廣義表可以被其他廣義表所共享
- 廣義表可以是一個遞歸的表,即廣義表也可以是其本身的子表
廣義表的運算:
- 取表頭GetHead(LS):取出表頭為非空廣義表的第一個元素,它可以是一個單原子也可以是一個子表
- 取表尾GetTail(LS):取出的表尾為除去表頭之外,由其余元素構成的表即表尾一定是一個廣義表
重要注意:廣義表()和(()).前者為空表,長度為n;后者長度為n,可分解得到表頭表尾皆為空表();
廣義表的深度:深度是指有幾對括號
例子:廣義表((a,b,c,d))的表頭是(a,b,c,d) 表尾是空表()深度是2 長度是1
廣義表的存儲結構
廣義表通常采用鏈式存儲結構,常用的鏈式存儲結構有兩種:頭尾鏈式的存儲結構和擴展線性鏈表的存儲結構
由於廣義表中的數據元素可能為原子或廣義表,由此需要兩種結構的結點:一種是廣義表結點用以表示廣義表,一種是原子結點用以表示原子
列表的第一種鏈式結構的結點
(a)表結點;(b)原子結點
表結點包含3個域:
1.標志域:tag=1,表明該結點是表結點。
2.表頭指針域:hp,指向該結點表示的子表的表頭。
3.表尾指針域:tp,指向該結點表示的子表的表尾。
原子結點包含2個域 :
1.標志域:tag=0,表明該結點是原子結點。
2.值域:atom,存放原子的值。
其表示方法為:任意廣義表都由表頭和表尾組成,所以都能用一個表結點表示。表頭可能是原子,也可能是廣義表。表尾一定是廣義表或空表,所以能用一個表結點表示或表明其是空表。
廣義表的長度:最高層的表結點個數即為廣義表的長度。
`/////------廣義表的頭尾鏈式存儲表示------
typedef enum{ATOM,LIST} ElemTag; ///ATOM==0:原子;LIST==1:子表;
typedef struct GLNode
{ ElemTag tag; ///公共部分,用以區分原子結點和表結點
union /// 原子結點和表結點的聯合部分
{
AtomType atom; ///atom是原子結點的值域,ATomType由用戶定義
struct {struct GLNode *hp,*tp;} ptr; ///ptr是表結點的指針域,ptr.hp和ptr.tp分別指向表頭和表尾
};
}*GList; ///廣義表類型
`