資料結構與演算法 雙向鍊錶

2022-02-24 22:14:47 字數 1949 閱讀 9385

ps:前面已經說過線性表的兩種表現形式,一種是順序,另一種是鏈式,鏈式的一種普通表現形式就是加入乙個指標,前乙個的指標指向後乙個結點的位址,那麼還有一種形式就是雙向鍊錶,裡面又加上了乙個指標變數,讓前指標變數指向直接前驅,後指標變數指向直接後繼。

/*

* * 建立結構體

* */

typedef

struct

doublelink doublelink, *doublelinkl;

/*

* * 初始化

* */

doublelinkl initlink()

在插入資料之前我們要考慮乙個事情就是,鍊錶中有資料和無資料的插入是否一樣,也就是說指標改變是否一致,在左右都有值的時候平時要改變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)

if (!p || i > pos-1

) doublelinkl s = (doublelinkl) malloc(sizeof

(doublelink));

s->data =e;

if (p->next ==null)

else

return0;

}

對於刪除比較簡單,在前後都有結點的情況下,如圖一,如果本來只要乙個結點,前面是首結點的情況下,直接把首結點的next指向null即可。(本人畫圖不怎麼樣不要在意)

一定要寫在該位置。

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,int

pos)

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 ...