PS:前面已經說過線性表的兩種表現形式,一種是順序,另一種是鏈式,鏈式的一種普通表現形式就是加入一個指針,前一個的指針指向后一個結點的地址,那么還有一種形式就是雙向鏈表,里面又加上了一個指針變量,讓前指針變量指向直接前驅,后指針變量指向直接后繼。
/** * 創建結構體 * */ typedef struct DoubleLink { int data; struct DoubleLink *prior; struct DoubleLink *next; } DoubleLink, *DoubleLinkL;
創建雙向鏈表並初始化
注:這里我們是只創建了一個空的鏈表,內部無數據,所以首結點的兩個指針變量要為NULL。
/** * 初始化 * */ DoubleLinkL initLink() { DoubleLinkL L = (DoubleLinkL) malloc(sizeof(DoubleLink)); L->next = NULL; L->prior = NULL; return L; }
開始插入數據
在插入數據之前我們要考慮一個事情就是,鏈表中有數據和無數據的插入是否一樣,也就是說指針改變是否一致,在左右都有值的時候平時要改變4條線,那么如果只有首結點的話移動幾條呢。
其實可以說是移動3條,但畫圖的話就看到兩條。
如圖:
::|::
首先當只要一個首結點或者在最后一個結點插入的情況下,如第一個圖,
s->next = p->next; s->prior = p; p->next = s;
當前后都有結點的時候,如第二個圖
s->next = p->next; s->prior = p; p->next = s; s->next->prior = s;
整體插入代碼就是
int insertLink(DoubleLinkL &L, int pos, int e) { DoubleLinkL p = L; int i = 0; while (p && i < pos-1) { p = p->next; i++; } if (!p || i > pos-1) { printf("插入失敗,下標問題\n"); return -1; } DoubleLinkL s = (DoubleLinkL) malloc(sizeof(DoubleLink)); s->data = e; if (p->next == NULL) { s->next = p->next; s->prior = p; p->next = s; } else { s->next = p->next; s->prior = p; p->next = s; s->next->prior = s; } return 0; }
刪除圖解
對於刪除比較簡單,在前后都有結點的情況下,如圖一,如果本來只要一個結點,前面是首結點的情況下,直接把首結點的next指向NULL即可。(本人畫圖不怎么樣不要在意)
p->next->next->prior=p;//一定要寫在該位置。 p->next=p->next->next;
如果首結點后只有一個結點
p->next=NULL;
刪除全部代碼
int deleteLink(DoubleLinkL &L,int pos,int e){ DoubleLinkL p = L; int i = 0; while (p && i < pos-1) { p = p->next; i++; } if (!p || i > pos-1) { printf("插入失敗,下標問題\n"); return -1; } if(p->next==NULL){ p->next=NULL; }else{ p->next->next->prior=p;//一定要寫在該位置。 p->next=p->next->next; } return 0; }
修改和查找
這個修改和查找是比較簡單的,直接找到知道該結點修改就完事了,干就對了。
int getElem(DoubleLinkL L,int pos){ DoubleLinkL p = L; int i = 0; while (p && i < pos) { p = p->next; i++; } if (!p || i > pos) { printf("查找失敗,下標問題\n"); return -1; } printf("查找的數據:%d\n",p->data); return 0; } int updataLink(DoubleLinkL &L,int pos,int e){ DoubleLinkL p = L; int i = 0; while (p && i < pos) { p = p->next; i++; } if (!p || i > pos) { printf("修改失敗,下標問題\n"); return -1; } p->data=e; return 0; }
總結:雙向鏈表主要是插入和刪除復雜點,其他的和單鏈表都差不多,雙向鏈表存在着4條指向線先后順序,如果連接順序不正確,斷開后的數據就會丟失。
完