朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)
阿新 • • 發佈:2018-10-31
朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)
單鏈表的侷限性
(1)單鏈表是對陣列的一個擴充套件,解決了陣列的大小比較死板不容易擴充套件的問題。使用堆記憶體來儲存資料,將資料分散到各個節點之間,其各個節點在記憶體中可以不相連,節點之間通過指標進行單向連線。連結串列中的各個節點記憶體不相連,有利於利用碎片化的記憶體。
(2)單鏈表各個節點之間只由一個指標單向連線,這樣實現有一些侷限性。侷限性主要體現在單鏈表只能經由指標單向移動(一旦指標移動過某個節點就無法再回來,如果要再次操作這個節點,除非從頭指標開始再次遍歷一次),因此單鏈表的某些操作就比較麻煩(演算法比較侷限)。回憶之前單鏈表的所有操作(插入,刪除節點,遍歷,從單鏈表中取某個節點的數。。。),因為單鏈表的單向移動性導致了不少麻煩。
總結:單鏈表的單向移動性導致我們在操作單鏈表時,當前節點只能向後移動不能向前移動,因此不自由,不利於解決更復雜的演算法。
解決思路:
單鏈表的節點 = 有效資料 + 指標(指標指向後一個節點)
雙向連結串列的節點 = 有效資料 + 2個指標(一個指向後一個節點,另一個指向前一個節點)
雙鏈表的封裝和程式設計實現
#include <stdio.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; } int main(void) { struct node *pHeader = create_node(0); //頭指標指向頭節點 return 0; }