diff options
-rw-r--r-- | list.c | 24 | ||||
-rw-r--r-- | list.h | 8 |
2 files changed, 28 insertions, 4 deletions
@@ -1,4 +1,3 @@ -#include <stddef.h> #include "list.h" struct _list { @@ -11,6 +10,26 @@ void list_init(struct list *list) { list->end = list; } +int list_empty(struct list *list) { + return list->head == list->end; +} + +int list_singleton(struct list *list) { + return list->head == list->tail && list->head != list->end; +} + +void *list_circular_prev(void *_node) { + struct _list *node = _node; + do { node = node->prev; } while (node == node->listhead); + return node; +} + +void *list_circular_next(void *_node) { + struct _list *node = _node; + do { node = node->next; } while (node == node->listhead); + return node; +} + void list_insert(void *_next, void *_node) { struct _list *node = _node; struct _list *next = _next; @@ -19,6 +38,7 @@ void list_insert(void *_next, void *_node) { prev->next = node; node->next = next; node->prev = prev; + node->listhead = next->listhead; } void list_remove(void *_node) { @@ -27,6 +47,4 @@ void list_remove(void *_node) { struct _list *prev = node->prev; next->prev = prev; prev->next = next; - node->next = NULL; - node->prev = NULL; } @@ -1,10 +1,16 @@ #pragma once -#define LINKEDLIST void *prev, *next +#define LINKEDLIST void *prev, *next, *listhead struct list { void *tail, *head, *end; }; extern void list_init(struct list *list); +extern int list_empty(struct list *list); +extern int list_singleton(struct list *list); + +extern void *list_circular_prev(void *_node); +extern void *list_circular_next(void *_node); + extern void list_insert(void *_next, void *_node); extern void list_remove(void *_node); |