/* * Copyright (C) 2013, 2014 Freie Universität Berlin * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level * directory for more details. */ /** * @ingroup core_util * @{ * * @file * @brief A simple priority queue * * @author Kaspar Schleiser * @} */ #include #include #include "priority_queue.h" #define ENABLE_DEBUG (0) #include "debug.h" void priority_queue_remove(priority_queue_t *root_, priority_queue_node_t *node) { /* The strict aliasing rules allow this assignment. */ priority_queue_node_t *root = (priority_queue_node_t *) root_; while (root->next != NULL) { if (root->next == node) { root->next = node->next; node->next = NULL; return; } root = root->next; } } priority_queue_node_t *priority_queue_remove_head(priority_queue_t *root) { priority_queue_node_t *head = root->first; if (head) { root->first = head->next; } return head; } void priority_queue_add(priority_queue_t *root, priority_queue_node_t *new_obj) { /* The strict aliasing rules allow this assignment. */ priority_queue_node_t *node = (priority_queue_node_t *) root; while (node->next != NULL) { /* not trying to add the same node twice */ assert(node->next != new_obj); if (node->next->priority > new_obj->priority) { new_obj->next = node->next; node->next = new_obj; return; } node = node->next; } node->next = new_obj; new_obj->next = NULL; } #if ENABLE_DEBUG void priority_queue_print(priority_queue_t *root) { printf("queue:\n"); for (priority_queue_node_t *node = root->first; node; node = node->next) { printf("Data: %u Priority: %lu\n", node->data, (unsigned long) node->priority); } } void priority_queue_print_node(priority_queue_node_t *node) { printf("Data: %u Priority: %lu Next: %u\n", (unsigned int) node->data, (unsigned long) node->priority, (unsigned int)node->next); } #endif