单链表

来源:互联网 发布:天风证券 数据库新浪 编辑:程序博客网 时间:2024/04/19 16:52

slist.h

 

typedef int elem_t;struct node_info {        elem_t data;        struct node_info *next;};struct list_info {        struct node_info head;        void (*add)(struct list_info *,                elem_t data);        void (*add_tail)(struct list_info *,                elem_t data);        void (*for_each)(struct list_info *,                void (*todo)(struct node_info *));        void (*del)(struct list_info *,                elem_t data);        void (*reverse)(struct list_info *);};void list_init(struct list_info *);void list_destroy(struct list_info *);


slist.c

static void list_reverse(struct list_info *info){        struct node_info *back = &info->head;        struct node_info *cur = back->next;        struct node_info *front = cur->next;        for (; cur != &info->head; ) {                cur->next = back;                back = cur;                cur = front;                front = front->next;        }        cur->next = back;}void list_init(struct list_info *info){        info->head.data = 0;        info->head.next = &info->head;        info->add = list_add;        info->add_tail = list_add_tail;        info->for_each = list_for_each;        info->del = list_del;        info->reverse = list_reverse;}void list_destroy(struct list_info *info){        struct node_info *cur = info->head.next;        for (; cur != &info->head; cur = info->head.next) {                info->head.next = cur->next;                free(cur);        }}


test.c

 


#include <stdio.h>
#include "slist.h"

#define LIST_LEN 10

static void print(struct node_info *node)
{
        printf("%d ", node->data);
}

int main()
{
        struct list_info list;
        list_init(&list);

        size_t i = 0;
        for (i = 0; i < LIST_LEN; i++) {
/*                list.add(&list, i);*/
                list.add_tail(&list, i);
        }

        list.del(&list, 0);

        list.for_each(&list, print);
        printf("\n");

        list.reverse(&list);

        list.for_each(&list, print);
        printf("\n");

        list_destroy(&list);

        return 0;
}