1. 程式人生 > >小白的資料結構與演算法學習筆記(二十六)----廣義表

小白的資料結構與演算法學習筆記(二十六)----廣義表

 一、廣義表的概述

首先回憶一下原子型別和結構型別,簡單說來,原子型別就是不可再分的型別,結構型別就是可以再分的型別。我們前面講的線性表要求每個元素都是原子型別,而廣義表作為線性表的推廣,它的元素可以是原子型別,也可以是個表。元素是原子型別,叫原子結點;元素是表,叫表結點。

廣義表允許表裡有表,所以它不是一對一的結構,自然是非線性結構。表中第一個元素叫作表頭,其他元素組成的表叫表尾,注意,表尾一定是表!

廣義表允許表的巢狀,就像遞迴一樣,因此廣義表既有長度,又有深度。長度就是廣義表中元素的個數,深度就是廣義表裡有多少個括號。

舉幾個例子,強化印象:

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))為例,畫圖: