利用雙向鍊錶可以避免單鏈表的缺點,單鏈表的缺點就是查詢指標p指向的節點,必須從指標p開始遍歷整個鍊錶一遍,時間複雜度為o(n)。
雙向鍊錶的每個節點有兩個指標乙個指標指向前驅節點,另乙個指向後繼節點
在雙向迴圈鍊錶中每個節點包括3個域,data域,prior域,next域。雙向鍊錶也分為帶頭節點和不帶頭節點
帶頭結點使某些操作更加方便,另外雙向鍊錶也有迴圈結構,成為雙向迴圈鍊錶,帶頭節點的雙向迴圈鍊錶,雙向
迴圈鍊錶為空的情況,判斷帶頭節點的雙向迴圈鍊錶為空的條件是:head->prior == head 或者head->next == head.
在雙向迴圈鍊錶中,因為每個節點既有前驅節點的指標域又有後繼節點的指標域,所以查詢節點非常方便。
雙向鍊錶的插入和刪除跟單鏈表跟單鏈表不同,其他沒有什麼差異,所以在這裡就直接講一下插入和刪除。
插入操作:就是要在帶頭的節點的雙向迴圈鍊錶中的第i個位置插入乙個元素的值為e的節點
,插入成功返回1,否則返回0。
演算法思想:首先找到第i個節點,用p指向該節點,再申請乙個新節點由s指向該節點將e放入到資料域然後開始修改
p和s指向節點指標域,修改s的prior,使其指向p的直接前驅結點。s->prior = p->prior;
將p的直接前驅結點的next域指向s指向的結點即p->prior->next = s;修改s的next指標域使其指向p指向的結點即s->next = p;
修改p的prior域,使其指向s 的指向的結點,即p->prior = s;
**一下:
int insertdlist(dlistlink head,int i,datatype e)
if(j != i)
s = (dlistnode *)malloc(sizeof(dlistnode));
if(!s)
return -1;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return 1;
}雙向迴圈鍊錶的刪除的操作--就是將帶頭節點的雙向迴圈鍊錶中的第i節點刪除。刪除成功返回1,否則返回0.
思路:1:首先找到第i個結點,用p指向該結點,然後開始修改p指向的結果的直接前驅和直接後繼結點的指標域,從而
將p鍊錶斷開,斷開分為2步:
一:p->prior-next = p->next;
二:p->next->prior = p->prior;
**如下:
int deletdlist(dlistlink head,int i,datatype *e)
if(j != i)
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return -1;
}
鍊錶學習筆記 雙向鍊錶
這次 寫的是迴圈鍊錶,用的是節點連線。雙向鍊錶相比與一般鍊錶要注意的地方就是 頭部插入和尾部插入 不要進行空指標操作。非鍊錶尾部的處理 if next null node pre current 如果是在頭部插如 則沒有 前節點 if i 0 tlist lenght return 0 dlinkl...
雙向鍊錶學習筆記
1.鍊錶介面定義 package com.ncs.datastructure.linklist public inte ce ilinklist 2.雙向鍊錶的簡單實現 package com.ncs.datastructure.linklist import com.ncs.datastructu...
C雙向鍊錶學習筆記
c雙向鍊錶學習筆記 語言 c語言 編譯環境 vc6.0 今天學習了kenneth a.reek著的 c和指標 一書,從中學習到了新知識,也發現了新問題,在這裡做一下記錄 首先先看一下 include includetypedef struct node node node rootp int dll...