朱有鵬C語言高階---4.9.10--雙鏈表--頭插入和尾插入(10)
阿新 • • 發佈:2018-10-31
朱有鵬C語言高階---4.9.10--雙鏈表--頭插入和尾插入(10)
尾插入:
頭插入:
注意下面的程式碼中,insert_head()函式裡面語句的順序,第一語句和第二語句的順序可以互相調換,但是第一語句和第二語句要在第三語句的前面,最後一句要放在最後面。
程式碼如下:
#include <stdio.h> #include <stdlib.h> //雙鏈表的節點 struct node { int data; //有效資料 struct node *pPrev; //前向指標,指向前一個節點 struct node *pNext; //後向指標,指向後一個節點 }; struct node *create_node(int data) { struct node *p = (struct node *)malloc(sizeof(struct node)); if (NULL == p) { printf("malloc error.\n"); return NULL; } p->data = data; p->pPrev = NULL; p->pNext = NULL; //預設建立的節點前向和後向指標都指向NULL return p; } // 將新節點new插入到連結串列pH的尾部 void insert_tail(struct node *pH, struct node *new) { // 第一步:先走到連結串列的尾節點 struct node *p = pH; while (NULL != p->pNext) { p = p->pNext; // 第一次迴圈,走過了頭節點 } // 迴圈結束後,p就指向了原來的最後一個節點 // 第二部:將新節點插入到原來的尾節點的後面 p->pNext = new; //後向指標關聯好了,新節點的地址和前節點的next new->pPrev = p; //前向指標關聯好了,新結點的prev和前節點的地址 //前節點的的prev和新節點的next指標未變動 } // 將新節點new前插入連結串列pH中 // 演算法參照圖示進行連結,一共有4個指標需要賦值。注意是順序。 void insert_head(struct node *pH, struct node *new) { // 新節點的next指標指向原來的第一個有效節點的地址 new->pNext = pH->pNext; // 原來第1個有效節點的prev指標指向新節點的地址 if (NULL != pH->pNext)//如果沒有有效節點 pH->pNext->pPrev = new; // 頭節點的next指標指向新節點地址 pH->pNext = new; // 新節點的prev指標指向頭節點的地址 new->pPrev = pH; } int main(void) { struct node *pHeader = create_node(0); //頭指標指向頭節點 insert_head(pHeader, create_node(11)); insert_head(pHeader, create_node(12)); insert_head(pHeader, create_node(13)); // 遍歷 printf("node 1 data: %d.\n", pHeader->pNext->data); printf("node 2 data: %d.\n", pHeader->pNext->pNext->data); printf("node 3 data: %d.\n", pHeader->pNext->pNext->pNext->data); struct node *p = pHeader->pNext->pNext->pNext; //p指向了最後一個節點 printf("node 3 data: %d.\n", p->data); printf("node 2 data: %d.\n", p->pPrev->data); printf("node 1 data: %d.\n", p->pPrev->pPrev->data); return 0; }