廣義表的儲存結構
由於廣義表(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...