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