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