小白的資料結構與演算法學習筆記(二十六)----廣義表
一、廣義表的概述
首先回憶一下原子型別和結構型別,簡單說來,原子型別就是不可再分的型別,結構型別就是可以再分的型別。我們前面講的線性表要求每個元素都是原子型別,而廣義表作為線性表的推廣,它的元素可以是原子型別,也可以是個表。元素是原子型別,叫原子結點;元素是表,叫表結點。
廣義表允許表裡有表,所以它不是一對一的結構,自然是非線性結構。表中第一個元素叫作表頭,其他元素組成的表叫表尾,注意,表尾一定是表!
廣義表允許表的巢狀,就像遞迴一樣,因此廣義表既有長度,又有深度。長度就是廣義表中元素的個數,深度就是廣義表裡有多少個括號。
舉幾個例子,強化印象:
A=() 空表,啥都沒有
B=(e)表中有一個原子元素,長度為1
C=(a,(b,c,d))表中有兩個元素,一個原子元素,一個子表,長度為2,表尾是((b,c,d))!
D=(A,B,C) 表可以共享,幾個表可以作為另一個表的子表,具體元素無需列出,長度為3
E=(a,E) 表可以遞迴,長度為2,E=(a,(a,(a······)))
二、廣義表的儲存結構
由於廣義表裡可以巢狀表,也就是廣義表的深度與長度及所佔空間我們無法確定,因此順序儲存結構無法滿足廣義表的需求,於是我們一般採用鏈式儲存結構儲存廣義表。主要兩種方法:首位連結串列儲存和擴充套件連結串列儲存。
#首尾連結串列儲存#
首尾連結串列儲存的結點:
表結點有三個域:標誌域tag,指向表頭的指標域hp,指向表尾的指標域tp
原子結點有兩個域:標誌域tag,值域elem
最高層表結點數即為表的長度!!
以C=(a,(b,c,d))為例,畫圖:
#擴充套件連結串列儲存#
擴充套件連結串列儲存的結點:
表結點有三個域:標誌域tag,指向表頭的指標域hp,指向下一個元素的指標域tp
原子結點有三個域:標誌域tag,值域,指向下一個元素的指標域tp
此處的tp區別於首尾連結串列儲存,並非指向表尾,而是類似於單鏈表中的next,指向下一個元素
以C=(a,(b,c,d))為例,畫圖: