單鏈表實現線性表時,在增刪節點時的確很方便,但是在訪問某個節點的前驅節點時,由於其內部只有從前驅指向後繼的指標,所以在這種情況下只能從頭遍歷。為了解決這個問題,引入了雙鏈表,即在每個節點中,加入乙個指向前驅節點的指標,從而方便雙向移動指標位置。
本質與單鏈表沒有太大的區別,只是多定義乙個指標而已。
struct lnode
;
大多數的實現與單鏈表沒有太大區別,但是在增加節點和刪除節點時需要多修改幾個指標。增加節點時,找到要增加位置的前乙個節點,修改的內容包括:要插入節點的前驅指標後繼指標、當前位置的後繼指標、當前位置後置節點的前驅指標。刪除時,也是先找到要刪除位置的前乙個節點,修改的內容包括:當前節點的後繼指標、當前節點的後繼結點的後繼結點的前驅指標。雖然說起來很拗口,但只要畫一下雙鏈表的圖示就很容易明白。
還有一點要注意,頭結點的前驅保持空即可,不需要指定其他的節點,否則就成了迴圈鍊錶。
//頭結點
struct lnode *l;
//尾結點
void
init()
void
print()
printf
("\n");
printf
("the length of the list is %d\n"
,head-
>num);}
void
headinsert
(int n)
}void
buttominsert
(int n)
}int
search
(int tar)
return-1
;}bool
insert
(int tar,
int num)
bool
delete
(int tar)
void
delmode()
void
insmode()
void
seamode()
intmain()
}return0;
}雙鏈表在單鏈表的基礎上增加了前驅指標,所以比單鏈表有更好的訪問行,當雙鏈表知道要刪除某一節點p或者在節點p前增加節點時時,獲取其前驅節點q的方式為 q = p->prior,不必再進行遍歷。故時間複雜度為o(1)。而若只知道待刪除節點的序號,則依然要按序查詢,時間複雜度仍為o(n)。
資料結構 線性表 雙鏈表
資料結構 線性表的鏈式表示 雙鏈表 線性表元素序號從1算起 date 2017 4 13 include include define initsize 100 define elemtype char typedef struct lnodelnode,linklist linklist crea...
資料結構專題 線性表之雙鏈表及其Java實現
這種鍊錶的缺點顯而易見,因為只能夠單向遍歷,即使我們想要訪問最後乙個元素也不得不從第乙個元素開始遍歷到最後乙個元素。為了解決這個問題,雙鏈表應運而生。和單鏈表十分相似,唯一的區別在於每個節點當中包含兩個指標域,分別指向著這個節點的前驅節點和後繼節點。因此,對於每乙個資料元素ai來說,除了儲存其本身的...
線性表 雙鏈表
雙鏈表也是線性表的一種,它的全稱是 線性雙向鏈結表,它有以下特點 在每個節點中除包含有數值域外,設定有兩個指標域,分別用以指向其前驅節點和後繼節點。既可以依次向後訪問每乙個節點,也可以依次向前訪問每乙個節點。dlinklist.h如下 include include typedef int elem...