數據結構學習總結--串數組廣義表(廣義表)


廣義表

定義:廣義表是線性表的推廣也稱為列表,廣義表一般記作\(LS=(a_{1},a_{2},,,,a_{n})\)
LS是廣義表\((a_{1},a_{2},,,,a_{n})\)的名稱,n是其長度
在廣義表的定義中,\(a_{i}\)可以是單個元素也可以是廣義表分別稱為廣義表的原子和子表,習慣上用大寫字母表示廣義表的名稱,用小寫字母表示原子
重要結論:

  1. 廣義表的元素可以是子表,而子表的元素還可以是子表
  2. 廣義表可以被其他廣義表所共享
  3. 廣義表可以是一個遞歸的表,即廣義表也可以是其本身的子表

廣義表的運算:

  1. 取表頭GetHead(LS):取出表頭為非空廣義表的第一個元素,它可以是一個單原子也可以是一個子表
  2. 取表尾GetTail(LS):取出的表尾為除去表頭之外,由其余元素構成的表即表尾一定是一個廣義表

重要注意:廣義表()和(()).前者為空表,長度為n;后者長度為n,可分解得到表頭表尾皆為空表();
廣義表的深度:深度是指有幾對括號
例子:廣義表((a,b,c,d))的表頭是(a,b,c,d) 表尾是空表()深度是2 長度是1

廣義表的存儲結構

廣義表通常采用鏈式存儲結構,常用的鏈式存儲結構有兩種:頭尾鏈式的存儲結構和擴展線性鏈表的存儲結構


由於廣義表中的數據元素可能為原子或廣義表,由此需要兩種結構的結點:一種是廣義表結點用以表示廣義表,一種是原子結點用以表示原子

列表的第一種鏈式結構的結點

(a)表結點;(b)原子結點

表結點包含3個域:

1.標志域:tag=1,表明該結點是表結點。

2.表頭指針域:hp,指向該結點表示的子表的表頭。

3.表尾指針域:tp,指向該結點表示的子表的表尾。

原子結點包含2個域 :

1.標志域:tag=0,表明該結點是原子結點。

2.值域:atom,存放原子的值。

其表示方法為:任意廣義表都由表頭和表尾組成,所以都能用一個表結點表示。表頭可能是原子,也可能是廣義表。表尾一定是廣義表或空表,所以能用一個表結點表示或表明其是空表。

廣義表的長度:最高層的表結點個數即為廣義表的長度。

 `/////------廣義表的頭尾鏈式存儲表示------
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;    ///廣義表類型
     `


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM