From cbd21e1da0d763225e7ea3594d4e6d8e96863790 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Tue, 30 May 2023 23:05:30 +0200 Subject: Added hash-based approach --- src/lib/queue.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/lib/queue.c (limited to 'src/lib/queue.c') diff --git a/src/lib/queue.c b/src/lib/queue.c new file mode 100644 index 0000000..f039257 --- /dev/null +++ b/src/lib/queue.c @@ -0,0 +1,61 @@ +// Copyright (c) 2023, Marvin Borner +// SPDX-License-Identifier: MIT + +#include + +#include +#include + +struct queue *queue_new(void) +{ + struct queue *queue = malloc(sizeof(*queue)); + if (!queue) + fatal("out of memory!\n"); + queue->head = 0; + queue->tail = 0; + return queue; +} + +void queue_free(struct queue *queue) +{ + while (queue->head) { + struct queue_node *node = queue->head; + queue->head = node->next; + free(node); + } + free(queue); +} + +void queue_push(struct queue *queue, void *data) +{ + struct queue_node *node = malloc(sizeof(*node)); + if (!node) + fatal("out of memory!\n"); + node->data = data; + node->next = 0; + if (queue->tail) { + queue->tail->next = node; + queue->tail = node; + } else { + queue->head = node; + queue->tail = node; + } +} + +void *queue_pop(struct queue *queue) +{ + if (!queue->head) + return 0; + struct queue_node *node = queue->head; + queue->head = node->next; + if (!queue->head) + queue->tail = 0; + void *data = node->data; + free(node); + return data; +} + +int queue_empty(struct queue *queue) +{ + return !queue->head; +} -- cgit v1.2.3