双向链表顾名思义它是一个链表,而且是一个双向的,双向的意思就是一个节点即引用了前一个节点也引用了后一个节点,他可以双向遍历,和单向链表一样只不过每个节点比单向链表多了一个前节点的引用
头文件:
#ifndef DOUBLE_LINK_LIST_H
#define DOUBLE_LINK_LIST_H
#include <stdio.h>
#define dlist_size(list) ((list)->size)
#define dlist_head(list) ((list)->head)
#define dlist_tail(list) ((list)->tail)
#define dlist_is_head(element) ((element)->pre==NULL)
#define dlist_is_tail(element) ((element)->next==NULL)
#define dlist_data(element) ((element)->data)
#define dlist_next(element) ((element)->next)
#define dlist_pre(element) ((element)->pre)
typedef struct DoubleLinkListElement_{
void * data;
struct DoubleLinkListElement_* pre;
struct DoubleLinkListElement_ *next;
} DoubleLinkListElement,*DoubleLinkListElementP;
typedef struct DoubleLinkList_{
int size;
void (*destroy)(void*data);
DoubleLinkListElementP head;
DoubleLinkListElementP tail;
}DoubleLinkList,*DoubleLinkListP;
void dlist_init(DoubleLinkListP list,void (*destroy)(void *data));
void dlist_destroy(DoubleLinkListP list);
int dlist_ins_next(DoubleLinkListP list,DoubleLinkListElementP element,void *data);
int dlist_ins_pre(DoubleLinkListP list,DoubleLinkListElementP element,void *data);
int dlist_rm(DoubleLinkListP list,DoubleLinkListElementP element,void**data);
DoubleLinkListP reverse_copy(const DoubleLinkListP list);
void reverse(DoubleLinkListP list);
#endif//DOUBLE_LINK_LIST_H
源文件:
#include "double_link_li