1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/core/clist.c

103 lines
2.1 KiB
C

/**
* 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 <kaspar.schleiser@fu-berlin.de>
* @}
*/
#include <stddef.h>
#include "clist.h"
#include <stdio.h>
/* 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);
}
*/