list
/* 雙向迴圈鍊錶,帶頭指標 */
struct list_node
;/* 初始化頭指標 */
void list_init_head(
struct list_node* head)
/* 量表是否為空 是返回1,否返回0 */
int list_is_empty(
const
struct list_node* head)
/* 鍊錶遍歷 */
#define list_for_each(iter, head) \
for(iter =
(head)
->next; iter !
=(head)
; iter = iter-
>next)
/* 鍊錶逆序遍歷 */
#define list_for_each_reverse(iter, head) \
for(iter =
(head)
->prev; iter !
=(head)
; iter = iter-
>prev)
/* 鍊錶遍歷,支援刪除操作 */
#define list_for_each_remove(iter, n, head) \
for(iter =
(head)
->next, n = iter-
>next; iter !
=(head)
; iter = n, n = iter-
>next)
/* 求包含此鍊錶的結構體指標 */
#define list_entry(ptr, type, member) \
((type *)(
(char*)
(ptr)-(
unsigned
long)(
&((type *
)0)-
>member)))
static
void __list_insert(
struct list_node* node,
struct list_node* prev,
struct list_node* next)
/* 插入頭節點 */
void list_push_front(
struct list_node* head,
struct list_node* node)
/* 插入尾節點 */
void list_push_back(
struct list_node* head,
struct list_node* node)
static
void __list_delete(
struct list_node* prev,
struct list_node* next)
/* 移除節點 */
void list_remove(
struct list_node* node)
/* 鍊錶接合 將list接合到head,新鍊錶的頭節點仍為head */
void list_splice(
struct list_node* head,
struct list_node*
list)}
test
#
include
#include
<
malloc
.h>
#include
"list.h"
struct stu
;int main()}
list_for_each(iter,
&head.
list
)printf
("\nreversed list:\n");
list_for_each_reverse(iter,
&head.
list
)struct list_node* iter_backup;
list_for_each_remove(iter, iter_backup,
&head.
list
)return 0;
}
C語言實現雙向迴圈鍊錶
list 雙向迴圈鍊錶,帶頭指標 struct list node 初始化頭指標 void list init head struct list node head 量表是否為空 是返回1,否返回0 int list is empty const struct list node head 鍊錶遍歷...
c語言實現雙向迴圈鍊錶
雙鏈表實現直通車 單迴圈鍊錶實現直通車 雙鏈表的實現與上面兩者都有大量相似之處。實現功能部分 雙迴圈鍊錶的實現 基於雙鏈表實現,大體區別是尾節點後繼指向頭節點,頭節點的前驅指向尾節點 主要區別還是列印,插入節點 首 中 尾 前插 後插.刪除節點 首 尾 需要特別注意 include include ...
雙向迴圈鍊錶 C語言實現
雙向迴圈鍊錶的儲存結構 雙向鍊錶也是採用的鏈式儲存結構,它與迴圈鍊錶的區別就是每個資料結點中多了乙個指向前驅元素的指標域 可以有頭結點,也可以沒有。它的儲存結構如下圖 當只有頭結點時 具體 實現 雙向迴圈鍊錶,有頭結點 define crt secure no warnings include in...