天天看點

小菜一步一步學資料結構之(四)單連結清單

上一篇部落格學習了順序表,最後也說明了順序表屬于靜态存儲,資料元素的個數不能自由的擴充。為了解決這個問題我們引入了連結清單

結點在存儲器中的位置是任意的,即邏輯上相鄰的資料元素在實體上不一定相鄰,是以線性表的鍊式表示又稱為非順序映像或鍊式映像。

小菜一步一步學資料結構之(四)單連結清單

* 資料域:存儲元素數值資料

* 指針域:存儲直接後繼結點的存儲位置

小菜一步一步學資料結構之(四)單連結清單

1. 結點:資料元素的存儲映像。有資料域和指針域兩部分組成。

2. 連結清單:n個結點由指針鍊組成一個連結清單。它是線性表的鍊式存儲映像,稱為線性表的鍊式存儲結構

3. 單連結清單、雙連結清單、循環連結清單:

* 結點隻有一個指針域的連結清單,稱為單連結清單或線性連結清單

* 有兩個指針域的連結清單,稱為雙連結清單

* 首尾相接的連結清單稱為循環連結清單

4. 頭指針是指向連結清單中第一個結點的指針

5. 首元結點是指連結清單中存儲第一個資料元素a1的結點

6. 頭結點是在連結清單的首元結點之前附設的一個結點;資料域内隻放空表标志和表長等資訊(可無)

當頭結點的指針域為空時表示空表

頭結點不能計傳入連結表長度值

非空表

空表

小菜一步一步學資料結構之(四)單連結清單

單連結清單是由表頭唯一确定,是以單連結清單可以用頭指針的名字來命名

若頭指針名是L,則把連結清單稱為表L

單連結清單的存儲結構定義

注意:

指針變量p:表示結點位址

結點變量*p:表示一個結點

【算法思想】

(1)生成新結點作為頭結點,用頭結點L指向頭結點。

(2)頭結點的指針域置空。

【算法描述】

從連結清單的第一個結點(L->next)開始順着鍊域掃描,用指針p指向目前掃描到的結點,p的初始值指向第1個結點(p=L->next)。用j做計數器,累計目前掃描過的結點數,j的初值為1,當p指向掃描到的下一個結點時,計數器j相應加1.當j=i時,p所指向的結點是想要找的第i個結點。

連結清單中查找其值與給定e相等的資料元素的過程和順序表類似,從第一個結點起,依次和e相比較,如果找到一個其值與e相等的資料元素,則傳回其在連結清單中的“位置”;如果查遍整個連結清單都沒有找到其值和e相等的元素,則傳回“NULL”。是以需要設定一個指針變量p順鍊掃描,直至p為“NULL”,或者p->data和e相等為止。

小菜一步一步學資料結構之(四)單連結清單

将值為e的新結點插入到表的第i個結點的位置上,即插入到結點ai-1與ai之間,分為一下幾步:

找到結點ai-1并由指針p指向該結點。

生成一個新結點*s。

将新結點*s的資料域置為e。

将新結點*s的指針域指向結點ai。

令結點ai-1的指針域指向新結點*s。

要删除單連結清單的第i個結點ai,分以下幾步:

小菜一步一步學資料結構之(四)單連結清單

1. 找到結點ai-1并由指針p指向該結點。

2. 臨時儲存待删除結點ai的位址在q中,以備釋放。

3. 令p->next指向ai的直接後繼結點。

4. 将待删除結點ai的值保留在e中

5. 釋放結點ai的空間。

前插法是通過将新結點逐個插傳入連結表的頭部(頭結點之後)來建立連結清單。首先建立隻有一個頭結點的空連結清單,每讀入一個資料元素則申請一個新結點,并将新結點插入到頭結點之後。

小菜一步一步學資料結構之(四)單連結清單

後插法是通過将新結點逐個插入到連結清單的尾部來建立連結清單。同前插法一樣,首先要建立一個隻有頭結點的空連結清單L,不同的是,為了使新結點能夠插入到表尾,需要增加一個尾指針r指向連結清單的尾結點,初始化時,r同L均指向頭結點。每讀入一個資料元素則申請一個新結點,将新結點插入到尾結點*r之後,然後使r指向新的尾結點。

小菜一步一步學資料結構之(四)單連結清單

循環連結清單是表中最後一個結點的指針域指向頭結點,整個連結清單形成一個環。

小菜一步一步學資料結構之(四)單連結清單

兩個線性表合并成一個表,将第一個表的尾指針指向第二個表的第一個結點,第二個表的尾指針指向第一個表的頭結點,然後釋放第二個表的頭結點。

繼續閱讀