Skip to content

Instantly share code, notes, and snippets.

@RobertDurfee
Last active September 16, 2020 14:27
Show Gist options
  • Save RobertDurfee/c9cae55139119197d8e42e8845b99077 to your computer and use it in GitHub Desktop.
Save RobertDurfee/c9cae55139119197d8e42e8845b99077 to your computer and use it in GitHub Desktop.
A simple queue implementation in C.
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Header
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define IN /* IN */
#define OUT /* OUT */
#define INOUT /* INOUT */
struct Value { };
struct Value *ValueNew();
void ValueDelete(INOUT struct Value **value);
struct QueueNode {
struct Value *value;
struct QueueNode *next;
};
struct QueueNode *QueueNodeNew(IN struct Value *value, IN struct QueueNode *next);
void QueueNodeDelete(INOUT struct QueueNode **node);
struct Queue {
struct QueueNode *first;
struct QueueNode *last;
};
struct Queue *QueueNew();
inline bool QueueIsEmpty(IN const struct Queue *queue);
void QueuePush(INOUT struct Queue *queue, IN struct Value *value);
struct Value *QueuePop(INOUT struct Queue *queue);
void QueueDelete(INOUT struct Queue **queue);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Value
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct Value *ValueNew() {
struct Value *value;
value = malloc(sizeof(struct Value));
return value;
}
void ValueDelete(INOUT struct Value **value) {
free(*value);
*value = NULL;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Queue Node
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct QueueNode *QueueNodeNew(IN struct Value *value, IN struct QueueNode *next) {
struct QueueNode *node;
node = malloc(sizeof(struct QueueNode));
node->value = value;
node->next = next;
return node;
}
void QueueNodeDelete(INOUT struct **node) {
if ((*node)->next) {
QueueNodeDelete(&(*node)->next);
}
if ((*node)->value) {
ValueDelete(&(*node)->value);
}
free(*node);
*node = NULL;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Queue
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct Queue *QueueNew() {
struct Queue *queue;
queue = malloc(sizeof(struct Queue));
queue->first = NULL;
queue->last = NULL;
return queue;
}
inline bool QueueIsEmpty(IN const struct Queue *queue) {
return !queue->first;
}
void QueuePush(INOUT struct Queue *queue, IN struct Value *value) {
struct QueueNode *node;
node = QueueNodeNew(value, NULL);
if (QueueIsEmpty(queue)) {
queue->first = node;
queue->last = node;
} else {
queue->last->next = node;
queue->last = node;
}
}
struct Value *QueuePop(INOUT struct Queue *queue) {
struct QueueNode *node;
struct Value *value;
node = queue->first;
if (node->next) {
queue->first = node->next;
} else {
queue->first = NULL;
queue->last = NULL;
}
value = node->value;
node->value = NULL;
node->next = NULL;
QueueNodeDelete(&node);
return value;
}
void QueueDelete(INOUT struct Queue **queue) {
if (!QueueIsEmpty(*queue)) {
QueueNodeDelete(&(*node)->first);
}
(*queue)->last = NULL;
free(*queue);
*queue = NULL;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment