嚴書 廣義表兩種儲存方式

2021-08-19 02:46:19 字數 1534 閱讀 5570

廣義表的儲存結構

由於廣義表(a1,a2,a3,…an)中的資料元素可以具有不同的結構,(或是原子,或是廣義表),因此,難以用順序儲存結構表示,通常採用鏈式儲存結構,每個資料元素可用乙個結點表示。

由於廣義表中有兩種資料元素,原子或廣義表,因此,需要兩種結構的結點:一種是表結點,用以表示列表;一種是原子結點,用以表示原子。 

若列表不空,則可分解成表頭和表尾;反之,一對確定的表頭和表尾可唯一確定列表。由此,乙個表結點可由三個域組成:標誌域、指示表頭的指標域和指示表尾的指標域;而原子結點只需兩個域:標誌域和值域。

1、僅有表結點由三個域組成:

標誌域、指示表頭的指標域和指示表尾的指標域;而原子域只需兩個域:標誌域和值域。

頭尾鍊錶儲存表示

[cpp]

view plain

copy

typedef

enum  elemtag;  //atom==0:表示原子,list==1:表示子表

typedef

struct glnode  ptr;  

// ptr是表結點的指標域,ptr.hp 和ptr.tp分別指向表頭和表尾

};  

} *glist;  //廣義表型別

示例如圖:

這種儲存結構的三個特點:

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

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

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

2、表結點和原子結點均由三個域組成:標誌域、指示表頭的指標域和指示表尾的指標域;原子結點的三個域為:標誌域、值域和指示表尾的指標域。

其型別定義如下:

擴充套件線性鍊錶儲存表示

[cpp]

view plain

copy

typedef 

enum  elemtag;                                

//atom==0:表示原子,list==1:表示子表

typedef struct glnode ;  

struct glnode    *tp;    

//相當於線性鍊錶的next,指向下乙個元素結點

} *glist;  //廣義表型別glist 是一種擴充套件的線性鍊錶

示例如圖:

表的兩種連線方式

內連線 也稱為等值連線 或稱連線,還可以被稱為普通連線或者自然連線 是最早的一種連線方式,內連線是從結果表中刪除與其他被連線表中沒有匹配行的所有無組,所以當匹配條件不滿足時內連線可能會丟失資訊。在where子句中設定的消除笛卡積的條件就是採用了等值判斷的方式進行的。外連線 內連線中只能顯示等值滿足的...

Oracle測試儲存過程兩種方式

在初學oracle時,寫了乙個儲存過程,名稱是 proc get bill,三個引數,第1,3是in引數,第2是out引數,寫完之後,想測一下,結果發現網上有多種方式 其重要是下面這兩種,只是寫法不同而已 剛開始把兩種變數定義方式搞錯了,一直執行不過,經慢慢嘗試,得到了下面兩種寫法,希望像我這樣初學...

線性表的兩種儲存方式 順序儲存和鏈式儲存

線性表是一種儲存方式,可以想象是很多個車廂連起來的火車。每個車廂有兩個區域,乙個存放資料乙個鏈結下一節車廂。線性表的一些基本操作。初始化,增加元素,刪除元素,查詢元素,輸出表中元素。鏈式儲存 例如鍊錶一樣通過指標把不同區域的資料聯絡起來形成順序儲存。include include typedef s...