顧名思義,廣義表是線性表的推廣。也有人稱其爲列表(Lists,用複數形式以示與統稱的表List 的區別)。
⒈廣義表的定義和性質
咱們知道,線性表是由n 個數據元素組成的有限序列。其中每一個組成元素被限定爲單元素,有時這種限制須要拓寬。例如,中國舉辦的某體育項目國際邀請賽,參賽隊清單可採用以下的表示形式:
(俄羅斯,巴西,(國家,河北,四川),古巴,美國,(),日本)
在這個拓寬了的線性表中,韓國隊應排在美國隊的後面,但因爲某種緣由未參加,成爲空表。國家隊、河北隊、四川隊均做爲東道主的參賽隊參加,構成一個小的線性表,成爲原線性表的一個數據項。這種拓寬了的線性表就是廣義表。
廣義表(Generalized Lists)是n(n≥0)個數據元素a1,a2,…,ai,…,an 的有序序列,通常記做:
ls=(a1,a2,…,ai,…,an)
其中:ls 是廣義表的名稱,n 是它的長度。每一個ai(1≤i≤n)是ls 的成員,它能夠是單個元素,也能夠是一個廣義表,分別稱爲廣義表ls 的單元素和子表。當廣義表ls 非空時,稱第一個元素a1 爲ls 的表頭(head),稱其他元素組成的表(a2,…,ai,…,an)爲ls 的表尾(tail)。顯然,廣義表的定義是遞歸的。
爲書寫清楚起見,一般用大寫字母表示廣義表,用小寫字母表示單個數據元素,廣義表用括號括起來,括號內的數據元素用逗號分隔開。下面是一些廣義表的例子:
A =()
B =(e)
C =(a,(b,c,d))
D =(A,B,C)
E =(a,E)
F =(())
⒉廣義表的性質
從上述廣義表的定義和例子能夠獲得廣義表的下列重要性質:
⑴廣義表是一種多層次的數據結構。廣義表的元素能夠是單元素,也能夠是子表,而子表的元素還能夠是子表,…。
⑵廣義表能夠是遞歸的表。廣義表的定義並無限制元素的遞歸,即廣義表也能夠是其自身的子表。例如表E 就是一個遞歸的表。
⑶廣義表能夠爲其餘表所共享。例如,表A、表B、表C 是表D 的共享子表。在D中能夠沒必要列出子表的值,而用子表的名稱來引用。
廣義表的上述特性對於它的使用價值和應用效果起到了很大的做用。
廣義表能夠當作是線性表的推廣,線性表是廣義表的特例。廣義表的結構至關靈活,在某種前提下,它能夠兼容線性表、數組、樹和有向圖等各類經常使用的數據結構。當二維數組的每行(或每列)做爲子表處理時,二維數組即爲一個廣義表。另外,樹和有向圖也能夠用廣義表來表示。因爲廣義表不只集中了線性表、數組、樹和有向圖等常見數據結構的特色,並且可有效地利用存儲空間,所以在計算機的許多應用領域都有成功使用廣義表的實例。
⒊廣義表基本運算
廣義表有兩個重要的基本操做,即取頭操做(Head)和取尾操做(Tail)。根據廣義表的表頭、表尾的定義可知,對於任意一個非空的列表,其表頭多是單元素也多是列表,而表尾必爲列表。例如:
Head(B)= e Tail(B)=()
Head(C)= a Tail(C)=((b,c,d))
Head(D)= A Tail(D)=(B,C)
Head(E)= a Tail(E)=(E)
Head(F)=() Tail(F)=()
此外,在廣義表上能夠定義與線性表相似的一些操做,如創建、插入、刪除、拆開、鏈接、複製、遍歷等。
CreateLists(ls):根據廣義表的書寫形式建立一個廣義表ls。
IsEmpty(ls):若廣義表ls 空,則返回True;不然返回False。
Length(ls):求廣義表ls 的長度。
Depth(ls):求廣義表ls 的深度。
Locate(ls,x):在廣義表ls 中查找數據元素x。
Merge(ls1,ls2):以ls1 爲頭、ls2 爲尾創建廣義表。
CopyGList(ls1,ls2):複製廣義表,即按ls1 創建廣義表ls2。
Head(ls):返回廣義表ls 的頭部。
Tail(ls):返回廣義表的尾部。
……