概念
廣義表(Generalized Lists)是n(n≥0)個數據元素a1,a2,…,ai,…,an 的有序序列,一般記作:
ls=(a1,a2,…,ai,…,an)
其中:ls 是廣義表的名稱,n 是它的長度每個ai(1≤i≤n)是ls 的成員:它可以是單個元素(“
廣義表ls 的
單元素
”),也可以是一個廣義表(“
廣義表ls 的
子表
”)。
當廣義表ls 非空時,稱第一個元素a1 為ls 的表頭(head),稱其余元素組成的表(a2,…,ai,…,an)為ls 的表尾(tail)。
廣義表的重要性質:
⑴廣義表是一種多層次的數據結構。廣義表的元素可以是單元素,也可以是子表,而子表的元素還可以是子表,…。
⑵廣義表可以是遞歸的表,即廣義表也可以是其自身的子表。例如表E 就是一個遞歸的表。
⑶廣義表可以為其他表所共享。例如,表A、表B、表C 是表D 的共享子表。在D中可以不必列出子表的值,而用子表的名稱來引用。
一些廣義表的例子:
A =()
B =(e)
C =(a,(b,c,d))
D =(A,B,C)
E =(a,E)
F =(())
存儲結構
頭尾表示法
由於廣義表中的數據元素既可能是列表也可能是單元素,相應地在頭尾表示法中結點的結構形式有兩種:一種是
表結點,用以表示列表;另一種是
元素結點,用以表示單元素:
- 表結點中包括一個指向表頭的指針和指向表尾的指針;
- 元素結點中應該包括所表示單元素的元素值。
- 為了區分這兩類結點,在結點中還要設置一個標志域:如果標志為1,則表示該結點為表結點;如果標志為0,則表示該結點為元素結點。

例子:
A =()
B =(e)
C =(a,(b,c,d))
D =(A,B,C)
E =(a,E)
F =(())

采用頭尾表示法容易分清列表中單元素或子表所在的
層次
。例如,在廣義表D 中,單元素a 和e 在同一層次上,而單元素b、c、d 在同一層次上且比a 和e 低一層,子表B 和C 在同一層次上。另外,最高層的表結點的個數即為廣義表的長度。例如,在廣義表D 的最高層有三個表結點,其廣義表的長度為3。
孩子兄弟表示法
兩種結點形式:一種是
有孩子結點,用以表示
列表;另一種是
無孩子結點,用以表示
單元素。
- 在有孩子結點中包括一個指向第一個孩子(長子)的指針和一個指向兄弟的指針
- 在無孩子結點中包括一個指向兄弟的指針和該元素的元素值
- 為了能區分這兩類結點,在結點中還要設置一個標志域:如果標志為1,則表示該結點為有孩子結點;如果標志為0,則表示該結點為無孩子結點。

例子:
A =()
B =(e)
C =(a,(b,c,d))
D =(A,B,C)
E =(a,E)
F =(())

采用孩子兄弟表示法時,表達式中的左括號“(”對應存儲表示中的tag=1 的結點,且最高層結點的tp域必為NULL。
參考來源:C語言中文網