ps:前面已經說過線性表的兩種表現形式,一種是順序,另一種是鏈式,鏈式的一種普通表現形式就是加入乙個指標,前乙個的指標指向後乙個結點的位址,那麼還有一種形式就是雙向鍊錶,裡面又加上了乙個指標變數,讓前指標變數指向直接前驅,後指標變數指向直接後繼。
/** * 建立結構體
* */
typedef
struct
doublelink doublelink, *doublelinkl;
/*在插入資料之前我們要考慮乙個事情就是,鍊錶中有資料和無資料的插入是否一樣,也就是說指標改變是否一致,在左右都有值的時候平時要改變4條線,那麼如果只有首結點的話移動幾條呢。* * 初始化
* */
doublelinkl initlink()
其實可以說是移動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對於刪除比較簡單,在前後都有結點的情況下,如圖一,如果本來只要乙個結點,前面是首結點的情況下,直接把首結點的next指向null即可。(本人畫圖不怎麼樣不要在意)e)
if (!p || i > pos-1
) doublelinkl s = (doublelinkl) malloc(sizeof
(doublelink));
s->data =e;
if (p->next ==null)
else
return0;
}
一定要寫在該位置。
p->next=p->next->next;
如果首結點後只有乙個結點
p->next=null;刪除全部**
int deletelink(doublelinkl &l,int pos,int這個修改和查詢是比較簡單的,直接找到知道該結點修改就完事了,幹就對了。e)
if (!p || i > pos-1
)
if(p->next==null)
else
return0;
}
int getelem(doublelinkl l,intpos)
if (!p || i >pos)
printf(
"查詢的資料:%d\n
",p->data);
return0;
} int updatalink(doublelinkl &l,int pos,int
e)
if (!p || i >pos)
p->data=e;
return0;
}
資料結構與演算法 雙向鍊錶
雖然從表內第乙個節點到最後乙個節點的遍歷操作是非常簡單的,但是反向遍歷鍊錶卻不是一件容易的事情。如果為node類新增乙個欄位來儲存指向前乙個節點的連線,那麼久會使得這個反向操作過程變得容易許多。當向鍊錶插入節點的時候,為了吧資料複製給新的字段會需要執行更多的操作,但是當腰吧節點從表移除的時候就能看到...
資料結構與演算法 雙向鍊錶
typedef struct lineline line initline line head return head line insertline line head,int data,int add else 判斷條件為真,說明插入位置為鍊錶尾 if body next null else r...
資料結構與演算法 資料結構之雙向鍊錶
雙向鍊錶自我感覺修改的時候有點繞,不過還好,如果實在不理解一定記得畫圖,其實很容易,但是想出來容易漏掉一些步驟,總之就是多動手 package org.yc public class test class doublelinkedlistheadelse temp.next studentnode ...