1. 程式人生 > >嚴書-廣義表兩種儲存方式

嚴書-廣義表兩種儲存方式

廣義表的儲存結構

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

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

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

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

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

頭尾連結串列儲存表示

  1. typedef enum {ATOM,LIST } ElemTag;  //ATOM==0:表示原子,LIST==1:表示子表  
  2. typedef struct GLNode {  
  3.     ElemTag  tag;  //公共部分,用以區分原子部分和表結點  
  4.     union {       //原子部分和表結點的聯合部分  
  5.       AtomType  atom; //atom是原子結點的值域,AtomType由使用者定義  
  6.       struct { struct GLNode *hp, *tp;} ptr;  
  7.  // ptr是表結點的指標域,ptr.hp 和ptr.tp分別指向表頭和表尾
      
  8.     };  
  9. } *Glist;  //廣義表型別  


示例如圖:

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

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

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

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

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

其型別定義如下:

擴充套件線性連結串列儲存表示

  1. Typedef enum { ATOM,LIST} ElemTag;                                
  2.     //ATOM==0:表示原子,LIST==1:表示子表  
  3. Typedef struct GLNode {  
  4.     ElemTag    tag;  //公共部分,用以區分原子部分和表結點  
  5.     union {  //原子部分和表結點的聯合部分  
  6.         AtomType    atom;  //原子結點的值域  
  7.         struct GLNode  *hp;  //表結點的表頭指標
  8.         };  
  9.         struct GLNode    *tp;    
  10.  //相當於線性連結串列的next,指向下一個元素結點
  11. } *Glist;  //廣義表型別Glist 是一種擴充套件的線性連結串列  


示例如圖: