单链表
来源:互联网 发布:天风证券 数据库新浪 编辑:程序博客网 时间: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;
}