一、单向链表
//list.h
#ifndef LIST_H_
#define LIST_H_
#include <stdlib.h>
typedef struct ListElement_ {
void *data;
struct ListElement_ *next;
} ListElement;
typedef struct List_ {
int size;
int (*match) (const void *data1, const void *data2);
void (*destory) (void* data);
ListElement *head;
ListElement *tail;
} List;
void list_init(List *list, void (*destory) (void *data)); //初始化链表,每次使用前都要去初始化
void list_destory(List *list); //销毁链表
int list_ins_next(List *list, ListElement *element, const void *data); //在指定的元素画面插入一个元素,如果element为NULL,则在表头插入
int list_rem_next(List *list, ListElement *element, void *data); //移除指定元素的后面一个元素
#define list_size(list) ((list)->size)
#define list_head(list) ((list)->head)
#define list_tail(list) ((list)->tail)
#define list_is_head(list, element) ((element) == (list->h