鏈表、頭指針、頭結點

圖1爲線性表(ZHAO, QIAN, SUN, LI, ZHOU, WU, ZHENG, WANG)的邏輯狀態。頭指針 指示鏈表中第一個結點(即第一個數據元素的存儲映像)的存儲位置。同時,由於最後一個數據元素沒有直接後繼,則線性鏈表中最後一個結點的指針爲“空”(NULL)。

           

                                                                            圖1 線性鏈表的邏輯狀態

由上述描述可見,單鏈表可由頭指針來唯一確定,在C語言中可用“結構指針”來描述。

 

  1. //-----線性表的單鏈表存儲結構-----   
  2. typedef struct LNode{   
  3.     ElemType   data;   
  4.     struct LNode  *next; 
  5. }LNode, *LinkList;  

有時在單鏈表的第一個結點之前附設一個結點,稱之爲頭結點  頭結點的數據域可以不存儲任何信息,也可以存儲如線性表長度等類的附加信息,頭結點的指針域存儲指向第一個結點的指針(即第一個元素結點的存儲位置)。如圖2(a)所示,此時,單鏈表的頭指針指向頭結點。若線性表爲空,則頭結點的指針域爲“空”,如圖2(b)所示。

              

                                                         

                                            圖2 帶頭結點的單鏈表   (a)非空表;(b)空表 

        循環鏈表 是另一種形式的鏈式存儲結構。它的特點是表中最後一個節點的指針域指向頭結點,整個鏈表形成一個環。由此,從表中任一結點出發均可找到表中其他結點,如圖3所示爲單鏈的循環鏈表 。  

   圖2.12

 

 

 

                                   圖3 單鏈循環表 (a)非空表;(b)空表

循環鏈表的操作和線性鏈表基本一致,差別僅在於算法中的循環條件不是p或p->next 是否爲空,而是它們是否等於頭指針,但有的時候,若在循環鏈表中設立尾指針而不設頭指針(如圖4(a)所示),可使某些操作簡化。例如將兩個線性表合併成一個表時,僅需將一個表的尾表和另一個表的頭表相接。當線性表以圖2.4(a)的循環鏈表作存儲結構時,這個操作僅需改變兩個指針值即可,運算時間爲O (1)。合併後的表如圖4(b)所示。

                              

                                                 圖4 僅設尾指針的循環鏈表 (a)兩個鏈表;(b)合併後的表

         以上討論的鏈式存儲結構的節點中只有一個指示直接後繼的指針域,由此,從某個結點出發只能順指針往後尋查其他結點。若要尋查節點的直接前趨,則需從表頭指針出發。換句話說,在單鏈表中,NextElem的執行時間爲O(1),而PriorElem的執行時間爲O(n)。爲克服單鏈表這種單向性的缺點,可利用雙向鏈表 。顧名思義,在雙向鏈表的結點中有兩個指針域,其一指向直接後繼,另一指向直接前趨。在C語言中可描述如下:  

 

                

                                                     

                                           圖5 雙向鏈表示例 (a)結點結構;(b)空的雙向循環鏈表;(c)非空的雙向循環鏈表

 

原文地址:http://blog.csdn.net/zhenyusoso/archive/2010/12/22/6092843.aspx

發佈了6 篇原創文章 · 獲贊 9 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章