单链表一(链表的实现)
头文件
#include <stdlib.h>#include <string.h>#include "list.h"void list_init(List *list, void (*destroy)(void *data)) { list->size = 0; list->destroy = destroy; list->head = NULL; list->tail = NULL; return;}void list_destroy(List *list) { /*指向被销毁的列表元素*/ void *data; while(list_size(list) > 0) { /*每次都删除头*/ if(list_rem_next(list, NULL, (void **)&data) ==0 && list->destroy != NULL) { /*如何处理被删除的函数由调用者传递的析构函数决定*/ list->destroy(data); } } /*清空链表结构*/ memset(list, 0, sizeof(List)); return;}int list_rem_next(List *list, ListElmt *element, void **data) { ListElmt *old_element; if (list_size(list) == 0) { return -1; } /*删除头*/ if (element == NULL) { *data = list->head->data; old_element = list->head; list->head = list->head->next; if (list_size(list) == 1) { list->tail == NULL; } } else { if (element->next == NULL) { return -1; } *data = element->next->data; old_element = element->next; element->next = element->next->next; if (element->next == NULL) { list->tail = element; } } free(old_element); list->size--; return 0;} int list_ins_next(List *list, ListElmt *element, const void *data) { ListElmt *new_element; if((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL) { return -1; } new_element->data = (void *)data; /*插入头*/ if (element == NULL) { if (list_size(list) == 0) { list->tail = new_element; } new_element->next = list->head; list->head = new_element; } else { if (element->next == NULL) { list->tail = new_element; } new_element->next = element->next; element->next = new_element; } list->size++; return 0;}