mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
103 lines
2.1 KiB
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);
|
|
}
|
|
*/
|