1. 程式人生 > >C——(單向、單向迴圈、雙向、雙向迴圈)連結串列學習總結

C——(單向、單向迴圈、雙向、雙向迴圈)連結串列學習總結

這段時間一邊看書一邊把連結串列的知識總結了一下,並且畫了示意圖來幫助理解。主要是單向連結串列,單向迴圈連結串列,雙向連結串列,雙向迴圈連結串列四個部分,每個部分都包括了初始化,建立,插入,刪除的基本操作,並總結了各個操作的核心程式碼。抽空可以看看Linux核心自帶的連結串列(list.h)寫法,增進學習。

以下的連結串列均是不操作頭節點的。

一、單向連結串列

1.單向連結串列:鏈式的儲存結構,在邏輯上是連續的,每次通過一個指標來指向下一個節點將其連結起來。
這裡寫圖片描述

2.初始化:就將head的next賦為NULL即可。
這裡寫圖片描述

3.建立:從head開始,往後不斷新增節點,每一次新建的節點,它的next都指向NULL。我們需要一個臨時指標,每新增的節點,就用這個指標指向它。
這裡寫圖片描述

4.插入:pNew的next先獲得原先前個節點所儲存的下個節點地址,再將新插入的節點儲存到前個節點的next中。(看圖吧……)
這裡寫圖片描述

5.刪除:
這裡寫圖片描述

二、單向迴圈連結串列

1.單向迴圈連結串列:與單向連結串列的區別就是,單向連結串列的最後一個節點指標是指向NULL的,單向迴圈連結串列最後一個節點的指標是指向頭節點head的。
這裡寫圖片描述

2.初始化:只有一個頭節點head的時候next就指向自己。
這裡寫圖片描述

3.建立:和單向連結串列差不多,區別就是最後一個節點的next指向的是head。
這裡寫圖片描述

4.插入:直接讓新插入節點的next指向下一個節點就行。在最後的位置插入也是不矛盾的,因為已經構成了一個環,最後位置的next就是指向的頭節點。
這裡寫圖片描述

5.刪除:
這裡寫圖片描述

三、雙向連結串列

1.雙向連結串列:包含兩個指標,一個(prior)指向前一個節點,一個(next)指向後一個節點。
這裡寫圖片描述

2.初始化:均讓head的prior和next為NULL即可。
這裡寫圖片描述

3.建立:與單向連結串列不同的是,新建的節點的prior都是指向了上一個節點的。同樣的,我們需要一個臨時指標來每次指向新增的節點。
這裡寫圖片描述

4.插入:這裡會有個坑,注意看 if() 裡;
看到建立的部分,我們每新建一個節點都將其prior指向了前一個節點,next都指向NULL。我們知道,新建節點的下一個節點的prior是要指向該新建節點的。如果這個新建節點剛好在最後的位置,temp->next都為NULL了,何來的prior?所以要加一個判斷,看節點是不是最後一個。
這裡寫圖片描述

5.刪除:
這裡寫圖片描述

四、雙向迴圈連結串列

1.雙向迴圈連結串列:最後一個節點的next指向head,而head的prior指向最後一個節點,構成一個環。
這裡寫圖片描述

2.初始化:只有一個頭節點head,就讓prior和next都指向自己。
這裡寫圖片描述

3.建立:與單向迴圈連結串列類似的,只是多了一個prior要考慮。
這裡寫圖片描述

4.插入:與單向迴圈連結串列類似,只是多了一個prior要考慮。這裡就不需判斷插入的位置是不是在最後了,已經構成一個環了。
這裡寫圖片描述

5.刪除:
這裡寫圖片描述

總結:開始時確實要動手畫一畫圖,分析一下各個指標的指向,否則容易在某個地方困擾。還有多閱讀別人寫的程式碼,多分析多積累。