/** * simple circular linked list * * Copyright (C) 2010 Freie Universität Berlin * * This file subject to the terms and conditions of the GNU General Public * License. See the file LICENSE in the top level directory for more details. * * @ingroup kernel * @{ * @file * @author Kaspar Schleiser * @} */ #include #include "clist.h" #include /* inserts new_node after node */ void clist_add(clist_node_t** node, clist_node_t* new_node) { if (*node != NULL) { new_node->next = (*node); new_node->prev = (*node)->prev; (*node)->prev->next = new_node; (*node)->prev = new_node; if ((*node)->prev == *node) { (*node)->prev = new_node; } } else { *node = new_node; new_node->next = new_node; new_node->prev = new_node; } } /* removes node. */ void clist_remove(clist_node_t** list, clist_node_t *node) { if (node->next != node) { node->prev->next = node->next; node->next->prev = node->prev; if (node == *list) *list = node->next; } else { *list = NULL; } } void clist_print(clist_node_t* clist) { clist_node_t *start = clist; while (clist != NULL ) { printf("list entry: %u prev=%u next=%u\n", clist->data, clist->prev->data, clist->next->data); clist = clist->next; if (clist == start) break; } } /* int main (int argc, char* argv[]) { clist_node_t a; clist_node_t b; clist_node_t c; clist_node_t* clist = NULL; a.data = 0; a.next = NULL; a.prev = NULL; b.data = 1; b.next = NULL; b.prev = NULL; c.data = 2; c.next = NULL; c.prev = NULL; printf("adding a,b,c\n"); clist_add(&clist,&a); clist_add(&clist,&b); clist_add(&clist,&c); clist_print(clist); printf("\n"); printf("removing b...\n"); clist_remove(&clist, &b); clist_print(clist); printf("\n"); printf("removing a...\n"); clist_remove(&clist, &a); clist_print(clist); printf("removing c...\n"); clist_remove(&clist, &c); clist_print(clist); } */