數據結構與算法----雙向鏈表


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條指向線先后順序,如果連接順序不正確,斷開后的數據就會丟失。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM