資料結構(C語言) 廣義表

2021-10-25 15:01:46 字數 1839 閱讀 4762

二、廣義表的儲存

廣義表是線性表的推廣,也稱為列表(lists)。線性表中的元素僅限於單個資料元素(原子),即不可以再分割;而廣義表中的元素即可以是原子,也可以是子表。

廣義表是n(n>=0)個資料元素a1,a2,a3…an的有序序列,一般記做:

ls=(a1,a2,a3…an)

其中ls是廣義表的名稱,n是廣義表的長度。每個a3(1<=3<=n)是ls非空時,稱第乙個元素a1為ls的表頭(head),稱其餘元素組成的表(a2,…,ai…,an)為ls的表尾(tail)。顯然,廣義表的定義是遞迴的。

廣義表通常用圓括號起來,並用逗號分隔開來,通常用大寫字母表示廣義表,用小寫字母表示單個資料元素。下面是廣義表的例子:

a=()——a是乙個空表,它的長度為零

b=(e)——列表b只有乙個原子e,它的長度是1

c=(a,(b,c,d))——列表c的長度為2,兩個元素分別為a和子表(b,c,d)

d=(a,b,c)——列表d的長度為3,三個元素都是列表,將a,b,c帶入後得d=((),(e),(a,(b,c,d))

e=(a,e)——這是乙個遞迴表,它的長度為2,正相當於乙個無限的列表。

廣義表的長度指該廣義表中所包含的元素(原子和子表)的個數。廣義表的深度指該廣義表所包含擴號的層數

(1)廣義表是一種多層次的資料結構,其中的元素可以是單元素,也可以是子表

(2)廣義表可以是遞迴的表,即廣義表也可以是其自身的子表。

(3)廣義表可以為其他表所共享。

廣義表結構相當靈活,可以相容線性表、陣列、樹和有向圖等各種常用的資料結構。

廣義表中的資料元素可以是具有不同的結構,因此難以用順序的儲存結構來表示,而鏈式儲存結構分配靈活,易於解決廣義表的共享與遞迴問題,所以通常都採用鏈式的儲存結構儲存廣義表。

廣義表的元素可以是資料元素,也可以是表,因此結點的結構也需要兩種:一種表結點,用以表示表;另一種是原子結點,用以表示原子。按結點形式的不同,廣義表的鏈式儲存結構又可以分為不同的兩種儲存方式。

由於廣義表中的資料元素即可能是表示也可能是單元素,相應地在頭尾表示法中結點的結構形式有兩種:一種是表結點,用以表示法;另一種是元素結點,用以表示原子。表結點由三個域:標誌域(tag=1)、表頭指標域(hp)、表尾指標域(tp)組成;而原子結點由兩個域;標誌域(tag=0)和值域(data)組成。廣義表的儲存結點可定義:

typedef

enum

elemtag;

typedef

struct glnodeptr;}}

*glist;

在這種儲存結構中有幾種情況:

(1)除空表的表頭指標為空外,對任何非空列表,其表頭指標均指向乙個表結點,且該結點中的hp域指示列表表頭(或為原子結點,或為表結點),tp域指向列表表尾(除非表尾為空,則指標為空,否則必為表結點)

(2)容易分請列表中原子和子表所在層次,如在列表d中,原子a和e在同一層次上,而b、c和d在同一層次且比a和e低一層,b和c是同一層的子表。

(3)最高層的表結點個數即為列表的長度。

廣義表的另一種表示法稱為孩子兄弟表示法。在孩子兄弟表示法中,也有兩種結點形式:一種是有孩子結點,用以表示子表;另一種是無孩子結點,用以表示原子。在有孩子結點中包括乙個指向第乙個孩子的指標和乙個指向兄弟的指標;而在無孩子結點中包括乙個指向兄弟的指標和該原子的元素值,為了能區分這兩類結點,在結點中設定乙個標誌域。如果標誌為1,表示該結點為有孩子結點;如果標誌為0,則表示結點為無孩子結點

typedef

enum

elemtag;

typedef

struct glnode

;struct glnode *tp;

}*glist;

資料結構 廣義表

廣義表 lists,又稱列表 是一種非線性的 資料結構 是線性表 的一種推廣。即廣義表中放鬆對錶元素的原子限制,容許它們具有其自身結構。思想 廣義表就類似下圖的結構,他的大體 下圖第一行 相當於乙個帶頭結點的鍊錶,思想,首先要有乙個頭結點為head型別,每乙個廣義表有且只有乙個head,而後每個節點...

資料結構 廣義表

概念 陣列和廣義表可以看成是線性表在下述含義上的擴充套件,表中資料元素本身也是乙個資料結構。廣義表也可以看作是線性表的推廣。1 廣義表的元素可以是子表,而子表的元素還可以包含子表。2 列表可以被其他列表所共享。3 列表可以是乙個遞迴的表,也就是說列表也可以是自身的子表。由於廣義表裡面的資料元素可以具...

資料結構 廣義表

一 問題概述 廣義表是非線性的資料結構,是由若干個元素組合而成的,廣義表中可以有子表,類似這樣的 我們以c a,b,c,d 為例,將它定義為這樣的資料結構 我們會給定字串的形式,如 char str a,b,c,d 然後將它轉化為如上的資料結構。二 解決辦法 1 將符號 看作是頭節點,然後將是數值的...