#include #include struct entry { void *value; struct entry *next, *prev; }; struct _skipstone_queue { size_t count; struct entry *last; }; skipstone_queue *skipstone_queue_new() { skipstone_queue *queue; if ((queue = malloc(sizeof(*queue))) == NULL) { goto error_malloc_queue; } queue->count = 0; queue->last = NULL; return queue; error_malloc_queue: return NULL; } size_t skipstone_queue_count(skipstone_queue *queue) { return queue->count; } int skipstone_queue_push(skipstone_queue *queue, void *value) { struct entry *next; if ((next = malloc(sizeof(*entry))) == NULL) { goto error_malloc_next; } next->value = value; next->next = NULL; next->prev = NULL; queue->last->next = next; queue->last = next; return 0; error_malloc_next: return -1; } int skipstone_queue_pop(skipstone_queue *queue, void **value) { struct entry *last = queue->last; if (last == NULL) { return 0; } queue->last = last->prev; free(last); return 0; }