雙向鍊錶對比單向鍊錶增加了乙個指向前乙個節點的指標。
雙向鍊錶和單向鍊錶節點的對比:
1、單向鍊錶的節點
//節點
typedef
struct nodenode_t;
//鍊錶的結構體
typedef
struct
link_t;
2 、 雙向鍊錶的節點
typedef
struct nodenode_t;
//鍊錶的結構體
typedef
struct
link_t;
3 、雙向鍊錶的相關操作
①初始化函式
void
link_init
(link_t* p_link)
②清理函式:主要是完成節點的釋放工作,在該函式中定義了三個指標p_fist,p_mid,p_last,p_first始終指向頭結點,將p_mid從鍊錶中摘取出來,完成記憶體的釋放工作。
void
link_deinit
(link_t* p_link)
}
③判斷鍊錶是否為空的函式:只要頭結點指向尾節點,則鍊錶就為空
int
linkisempty
(const link_t* p_link)
④獲取鍊錶中元素的個數的函式:遍歷鍊錶,只要p_mid沒有到尾節點,就在元素的個數+1
//獲取鍊錶中的數字個數
intlink_size
(const link_t* p_link)
return count;
}
⑤ 鍊錶的插入操作:包括在鍊錶的尾部插入數字,在鍊錶的最前面插入數字,在鍊錶的中間插入
在鍊錶的尾部插入數字:由於是雙向鍊錶`,可以通過指向相鄰位置的三個指標的第乙個指標指向尾節點的前乙個指標,中間的指標就指向尾節點,在第乙個指標和中間指標之間插入節點即可。
//在最後面加入數字的函式(在鍊錶中插入節點)
int(link_t* p_link,
int val)
在鍊錶的最前面插入數字:本質上和在鍊錶的尾部插入資料一樣,找到插入的位置,將節點插入。
int
link_add_head
(link_t* p_link,
int val)
p_node-
>val = val;
p_node-
>p_next =
null
; p_node-
>p_prev =
null
; p_first =
&p_link-
>head;
p_mid = p_first-
>p_next;
p_last = p_mid-
>p_next;
p_first-
>p_next = p_node;
p_node-
>p_next = p_mid;
p_mid-
>p_prev = p_node;
p_node-
>p_prev = p_first;
return1;
}
在鍊錶的中間插入數字(按從小到大的順序插入)
//按照從小到大的順序插入在鍊錶的中間
intlink_insert
(link_t* p_link,
int val)
p_node-
>val = val;
p_node-
>p_next =
null
; p_node-
>p_prev =
null
;for
(p_tmp =
&p_link-
>head;p_tmp!=
&p_link-
>tail;p_tmp=p_tmp-
>p_next)
}return1;
}
⑥ 鍊錶的刪除操作:
從尾部刪除元素:
int
link_remove_tail
(link_t* p_link)
node_t* p_first =
null
,*p_mid =
null
,*p_last =
null
; p_link-
>p_cur =
null
; p_first =
&p_link-
>head;
p_mid = p_first-
>p_next;
p_last = p_mid-
>p_next;
p_first-
>p_next = p_last;
p_last-
>p_prev = p_first;
free
(p_mid)
; p_mid =
null
;return1;
}
鍊錶中刪除某乙個指定的資料
//刪除某乙個數字
intlink_remove
(link_t* p_link,
int val)
if(p_mid ==
&p_link-
>tail)
⑦鍊錶的查詢操作
查詢第乙個元素的值:
void
link_get_head
(const link_t* p_link,
int* val)
查詢最後乙個元素的值
int
link_get_tail
(const link_t* p_link,
int* val)
根據編號獲取元素的值
int
link_get
(const link_t* p_link,
int sn,
int* val)
cnt++;}
return0;
}
⑧鍊錶的遍歷
正向遍歷:從頭節點開始一次遍歷到尾節點
//讓鍊錶進入從前向後遍歷狀態的函式
void
link_begin
(link_t* p_link)
//在從前向後的遍歷過程中,獲得下乙個數字的函式
intlink_next
(link_t* p_link,
int* val)
else
}void
display
(link_t* p_link)
else
break;}
printf
("\n");
}
反向遍歷
//讓鍊錶進入從後向前遍歷過程的函式
void
link_rbegin
(link_t* p_link)
//從後前面遍歷的過程中獲得前乙個數字的函式
intlink_prev
(link_t* p_link,
int* val)
p_link-
>p_cur = p_link-
>p_cur-
>p_prev;
if(p_link-
>p_cur ==
&p_link-
>head)
else
void
rdisplay
(link_t* p_link)
else
break;}
printf
("\n");
}
資料結構雙向鍊錶(c語言)
通過c語言實現雙向鍊錶的建立 初始化 頭插法插入結點 尾插法插入結點 在指定位置新增結點 刪除指定位置的結點 查詢結點的內容 獲取結點的長度 列印輸出結點的內容。include include typedef struct list list void newlist list l void set...
雙向鍊錶 資料結構C語言
在雙鏈表中,nextelem 的函式執行時間為o 1 而 priorelem 的執行時間為o n 所以定義了雙鏈表的概念 雙鏈表的儲存結構為的 實現 飛飛飛 雙向鍊錶的儲存結構 typedef struct dulnodedulnode,dulinklist 雙向鍊錶中有兩個指標域,分別為直接前驅和...
資料結構 雙向鍊錶(C語言)
description 學會了單向鍊錶,我們又多了一種解決問題的能力,單鏈表利用乙個指標就能在記憶體中找到下乙個位置,這是乙個不會輕易斷裂的鏈。但單鏈表有乙個弱點 不能回指。比如在鍊錶中有兩個節點a,b,他們的關係是b是a的後繼,a指向了b,便能輕易經a找到b,但從b卻不能找到a。乙個簡單的想法便能...