diff options
Diffstat (limited to 'src/01/01a/priority_queue.c')
| -rw-r--r-- | src/01/01a/priority_queue.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/01/01a/priority_queue.c b/src/01/01a/priority_queue.c index e69de29..f6e3364 100644 --- a/src/01/01a/priority_queue.c +++ b/src/01/01a/priority_queue.c @@ -0,0 +1,68 @@ +#include "priority_queue.h" +#include <stdlib.h> + +PriorityQueue *initialize() { + PriorityQueue *queue = malloc(sizeof(PriorityQueue)); + queue->size = 0; + queue->head = NULL; + return queue; +} + +Node *create_node(int priority, int data) { + Node *node = malloc(sizeof(Node)); + node->priority = priority; + node->data = data; + node->next = NULL; + return node; +} + +// This function is constant time O(1) +int size(PriorityQueue *queue) { + return queue->size; +} + +// This function is linear time O(n) +void add(PriorityQueue *queue, Node *node) { + queue->size++; + + if (queue->head == NULL) { + queue->head = node; + return; + } + + Node *tmp = queue->head; + Node *prev = NULL; + + while(tmp != NULL) { + if (tmp->data > node->data) { + node->next = tmp; + if (tmp == queue->head) + queue->head = node; + else if (prev != NULL) + prev->next = node; + break; + } + prev = tmp; + tmp = tmp->next; + } +} + +// This function is constant time O(1) +Node *delete_min(PriorityQueue *queue) { + Node *tmp = queue->head; + queue->head = tmp->next; + return tmp; +} + +void destroy(PriorityQueue *queue) { + Node *current = queue->head; + Node *tmp; + + while(current) { + tmp = current, current = current->next; + + if (tmp) free(tmp); + } + free(queue); +} + |
