嚴書-廣義表兩種儲存方式
阿新 • • 發佈:2019-02-07
廣義表的儲存結構
由於廣義表(a1,a2,a3,…an)中的資料元素可以具有不同的結構,(或是原子,或是廣義表),因此,難以用順序儲存結構表示,通常採用鏈式儲存結構,每個資料元素可用一個結點表示。
由於廣義表中有兩種資料元素,原子或廣義表,因此,需要兩種結構的結點:一種是表結點,用以表示列表;一種是原子結點,用以表示原子。
若列表不空,則可分解成表頭和表尾;反之,一對確定的表頭和表尾可唯一確定列表。由此,一個表結點可由三個域組成:標誌域、指示表頭的指標域和指示表尾的指標域;而原子結點只需兩個域:標誌域和值域。
1、僅有表結點由三個域組成:
標誌域、指示表頭的指標域和指示表尾的指標域;而原子域只需兩個域:標誌域和值域。
頭尾連結串列儲存表示
- typedef enum {ATOM,LIST } ElemTag; //ATOM==0:表示原子,LIST==1:表示子表
- typedef struct GLNode {
- ElemTag tag; //公共部分,用以區分原子部分和表結點
- union { //原子部分和表結點的聯合部分
- AtomType atom; //atom是原子結點的值域,AtomType由使用者定義
- struct { struct GLNode *hp, *tp;} ptr;
- // ptr是表結點的指標域,ptr.hp 和ptr.tp分別指向表頭和表尾
- };
- } *Glist; //廣義表型別
示例如圖:
這種儲存結構的三個特點:
1。除空表的表頭指標為空外,對任何非空列表,其表頭指標均指向一個表結點,且該結點中的hp域指示列表表頭,tp域指向列表表尾(除非表尾為空,則指標為空,否則必為表結點);
2。容易分清列表中原子和子表所在層次。如在列表D中,原子e和a在同一層次上,而b、c和d在同一層次且比e和a低一層,B和C是同一層的子表;
3。最高層的表結點個數即為列表的長度。
2、表結點和原子結點均由三個域組成:標誌域、指示表頭的指標域和指示表尾的指標域;原子結點的三個域為:標誌域、值域和指示表尾的指標域。
其型別定義如下:
擴充套件線性連結串列儲存表示
- Typedef enum { ATOM,LIST} ElemTag;
- //ATOM==0:表示原子,LIST==1:表示子表
- Typedef struct GLNode {
- ElemTag tag; //公共部分,用以區分原子部分和表結點
- union { //原子部分和表結點的聯合部分
- AtomType atom; //原子結點的值域
- struct GLNode *hp; //表結點的表頭指標
- };
- struct GLNode *tp;
- //相當於線性連結串列的next,指向下一個元素結點
- } *Glist; //廣義表型別Glist 是一種擴充套件的線性連結串列
示例如圖: