C語言實現雙向鍊錶

2021-09-25 17:44:42 字數 4838 閱讀 8476

linklist.h 

#ifndef __linklist_h

#define __linklist_h

/* * 節點 包含前置指標和後置指標

*/struct listnode

;struct list

;#define listnextnode(x) ((x) ? ((x)->next) : null)

#define listhead(x) ((x) ? ((x)->head) : null)

#define listtail(x) ((x) ? ((x)->tail) : null)

#define listcount(x) ((x)->count)

#define list_isempty(x) ((x)->head == null && (x)->tail == null)

#define listgetdata(x) (assert((x)->data != null), (x)->data)

/* prototypes. */

extern struct list *list_new(void); //建立乙個新列表

extern void list_free (struct list *);

extern void listnode_add (struct list *, void *);

extern void listnode_add_sort (struct list *, void *);

extern void list_sort (struct list *list);

extern void listnode_add_after (struct list *, struct listnode *, void *);

extern void listnode_delete (struct list *, void *);

extern struct listnode * listnode_lookup (struct list *list, void *data);

extern struct listnode * listnode_lookup_t (struct list *list, void *data, int type);

extern int listnode_change(struct list *list, void *old_data, void *new_data, int type);

extern void *listnode_head (struct list *);

extern void list_delete (struct list *);

extern void list_delete_all_node (struct list *);

extern void list_delete_node (struct list *, struct listnode *);

extern void list_add_node_prev (struct list *, struct listnode *, void *);

extern void list_add_node_next (struct list *, struct listnode *, void *);

extern void list_add_list (struct list *, struct list *);

extern void list_copy_list (struct list *l, struct list *m);

extern void aidlist_copy_list (struct list *l, struct list *m);

/* list iteration macro.

* * usage: for (all_list_elements (...)

* * it is safe to delete the listnode using this macro.

* */

#define all_list_elements(list,node,nextnode,data) \

(node) = listhead(list), ((data) = null); \

(node) != null && \

((data) = listgetdata(node),(nextnode) = node->next, 1); \

(node) = (nextnode), ((data) = null)

#endif

linklist.c

#include #include #include #include #include #include "linklist.h"

#include "basic_info.h"

#include "zlog.h"

/* *建立新的鍊錶

*/struct list *list_new (void)

/* *釋放鍊錶

*/void list_free (struct list *l)

/* *建立靜態鍊錶,僅供內部使用

*/static struct listnode * listnode_new (void)

/* *釋放靜態鍊錶

*/static void listnode_free (struct listnode *node)

free(node);

node = null;}/*

*新增新的資料進入鍊錶

*/void listnode_add (struct list *list, void *val)

/* * 向列表中新增節點。

* 如果列表是根據cmp函式排序的,請插入乙個具有給定val的新節點,以便列表保持排序狀態。

* 始終插入新節點;不存在省略重複項的概念。

*/void listnode_add_sort (struct list *list, void *val)}}

new->prev = list->tail;

if (list->tail)

list->tail->next = new;

else

list->head = new;

list->tail = new;

list->count++;}/*

*鍊錶整體排序

*cmp函式為自定義排序方式

*/void list_sort (struct list *list)}}

}void listnode_add_after (struct list *list, struct listnode *pp, void *val)

else

}list->count++;

}/*

*從列表中刪除特定的資料指標。

*/void listnode_delete (struct list *list, void *val)

}}/*

*返回頭節點的資料

*/void *listnode_head (struct list *list)

/* * 從鍊錶中刪除所有節點

*/void list_delete_all_node (struct list *list)

list->head = list->tail = null;

list->count = 0;}/*

* 從鍊錶中刪除所有節點並釋放鍊錶

*/void list_delete (struct list *list)

/* * 查詢具有給定資料的節點。如果type = 1則選擇自定義的查詢方法(find),否則使用預設查詢方法

*/struct listnode * listnode_lookup (struct list *list, void *data)

/* * 查詢具有給定資料的節點。如果type = 1則選擇自定義的查詢方法(find),否則使用預設查詢方法

*/struct listnode * listnode_lookup_t (struct list *list, void *data, int type)

}return null;

}else

}/** 替換指定資料的節點

* 如果type = 1則選擇自定義的查詢替換方法(find、change),否則使用預設查詢方法

* 成功返回0,失敗返回-1

*/int listnode_change(struct list *list, void *old_data, void *new_data, int type)

return -1;

}else

node->data = new_data;

return 0;

}return -1;

}}/*

* 從鍊錶中刪除節點

*/void list_delete_node (struct list *list, struct listnode *node)

void list_add_node_prev (struct list *list, struct listnode *current, void *val)

void list_add_node_next (struct list *list, struct listnode *current, void *val)

/* *鍊錶新增功能:在l後面新增鍊錶m資料

*/void list_add_list (struct list *l, struct list *m)}/*

* 鍊錶複製功能,將m鍊錶複製給l鍊錶,若l鍊錶存在資料,會先被清空

*/void list_copy_list (struct list *l, struct list *m)

}

雙向鍊錶C語言實現

ifndef stdlist h define stdlist h typedef struct tagstdnode stdnode,lpstdnode typedef struct tagstdlist stdlist,lpstdlist 鍊錶資料結構 struct tagstdnode 鍊錶節...

c語言實現雙向鍊錶

單向鍊錶有一定的缺陷,其中乙個就是只能一條路走到黑,只能前進不能後退,但雙向鍊錶就解決了這一問題 include include typedef struct node node,linklist void create list tail linklist l 頭插法建立 void create ...

C語言實現雙向鍊錶

1.定義兩個結構體,乙個表示鍊錶的乙個單元,另乙個表示鍊錶的頭結點 2.鍊錶的初始化 必須讓頭結點的next和prev指向自己 清除 不刪除頭結點 銷毀 刪除頭結點 3.增操作 每次增加需要開闢乙個單元,所以直接建立乙個函式用來建立單元 頭插 尾插 pos結點之前插 4.刪操作 分為三種 刪除pos...