读书人

单链表1(链表的实现)

发布时间: 2012-10-10 13:58:11 作者: rapoo

单链表一(链表的实现)

头文件

#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;}


读书人网 >编程

热点推荐