1. 程式人生 > >(六)雙鏈表的結構和插入節點

(六)雙鏈表的結構和插入節點

cti ria node imp 兩個 style class ber clas

(六)雙鏈表的結構和插入節點

雙鏈表結構雙鏈表算法之插入節點(尾部插入)雙鏈表算法之插入節點(頭部插入)

雙鏈表結構

??雙鏈表並不是有兩個鏈表,而是有兩個遍歷方向的鏈表,因此我們說的雙鏈表其實是雙向鏈表的簡稱。

  • 單鏈表節點 = 有效數據 + 指針(指向下一個節點)
  • 雙鏈表節點 = 有效數據 + 兩個指針(分別指向前一節點和後一節點)
技術分享圖片
 1/*
2 *雙鏈表節點
3 */

4struct node
5{

6 int data;
7 struct node *pPrev;
8 struct node *pNext;
9}
10struct node *create_node(int
data)

11
{
12 struct node *p = (struct node *)malloc(sizeof(struct node));
13 if(NULL == p)
14 {
15 printf("malloc error.\n");
16 return NULL;
17 }
18 p -> data = data;
19 p -pPrev = NULL;
20 p ->pNext = NULL;
21 return p;
22}

雙鏈表算法之插入節點(尾部插入)

思路分析

技術分享圖片
  • 遍歷移動到鏈表的尾部節點;
  • 將新節點連接到原來的尾部節點
    • 新節點的pPrev指向前一節點
    • 原尾部節點的pNext指向新節點
      代碼實現
 1/*
2 *pH :頭指針
3 *new : 新節點指針
4 */

5void insert_tail(struct node *pH,struct node *new)
6
{
7 //第一步:找到鏈表尾節點
8 struct node *p = pH; //頭節點指針
9 while(NULL != p -> pNext)
10 {
11 p = p -> pNext; //移動
12 }
13 //第二步:將新節點插入到原來的尾節點後面
14 p -> pNext = new
;
15 new -> pPrev = p;
16}

雙鏈表算法之插入節點(頭部插入)

思路分析

技術分享圖片
  • 新節點的pNext指向原來節點的第一個有效節點
  • 節點1的pPrev指向新節點
  • 頭節點的pPrev指向新節點
  • 新節點的pPrev指向頭節點
    代碼實現
 1/*
2 * pH : 指向頭節點
3 * new : 新節點
4 */

5void insert_head(struct node *pH,struct node *new)
6{
7 new -> pNext = pH ->pNext ; //(1)新節點的pNext指向原來節點的第一個有效節點
8 if(NULL != pH -> pNext) //當鏈表只有一個頭節點不處理
9 pH -> pNext -> pPrev = new; //(2)節點1的pPrev指針指向新節點的地址
10 pH -> pNext = new; //(3)頭節點的pNext指向新節點的地址
11 new -> pPrev = pH; //(4)新節點的pPrev指向頭節點
12}

(六)雙鏈表的結構和插入節點