Skip to content

Instantly share code, notes, and snippets.

@RobertDurfee
Last active September 16, 2020 14:27
Show Gist options
  • Select an option

  • Save RobertDurfee/c9cae55139119197d8e42e8845b99077 to your computer and use it in GitHub Desktop.

Select an option

Save RobertDurfee/c9cae55139119197d8e42e8845b99077 to your computer and use it in GitHub Desktop.

Revisions

  1. RobertDurfee revised this gist Sep 16, 2020. 1 changed file with 12 additions and 15 deletions.
    27 changes: 12 additions & 15 deletions queue.c
    Original file line number Diff line number Diff line change
    @@ -8,15 +8,24 @@
    #define OUT /* OUT */
    #define INOUT /* INOUT */

    struct Value;
    struct Value { };

    struct Value *ValueNew();
    void ValueDelete(INOUT struct Value **value);

    struct QueueNode;
    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 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);
    @@ -27,8 +36,6 @@ void QueueDelete(INOUT struct Queue **queue);
    // Value
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    struct Value { };

    struct Value *ValueNew() {
    struct Value *value;

    @@ -46,11 +53,6 @@ void ValueDelete(INOUT struct Value **value) {
    // Queue Node
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    struct QueueNode {
    struct Value *value;
    struct QueueNode *next;
    };

    struct QueueNode *QueueNodeNew(IN struct Value *value, IN struct QueueNode *next) {
    struct QueueNode *node;

    @@ -76,11 +78,6 @@ void QueueNodeDelete(INOUT struct **node) {
    // Queue
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    struct Queue {
    struct QueueNode *first;
    struct QueueNode *last;
    };

    struct Queue *QueueNew() {
    struct Queue *queue;

  2. RobertDurfee revised this gist Sep 16, 2020. 1 changed file with 27 additions and 0 deletions.
    27 changes: 27 additions & 0 deletions queue.c
    Original file line number Diff line number Diff line change
    @@ -1,15 +1,42 @@
    #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 QueueNode *QueueNodeNew(IN struct Value *value, IN struct QueueNode *next);
    void QueueNodeDelete(INOUT struct QueueNode **node);

    struct Queue;
    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 { };

    struct Value *ValueNew() {
    struct Value *value;

    value = malloc(sizeof(struct Value));

    return value;
    }

    void ValueDelete(INOUT struct Value **value) {
    free(*value);
    *value = NULL;
  3. RobertDurfee created this gist Sep 16, 2020.
    113 changes: 113 additions & 0 deletions queue.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,113 @@
    #include <stdlib.h>

    #define IN /* IN */
    #define OUT /* OUT */
    #define INOUT /* INOUT */

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Value
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    struct Value { };

    void ValueDelete(INOUT struct Value **value) {
    free(*value);
    *value = NULL;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Queue Node
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    struct QueueNode {
    struct Value *value;
    struct QueueNode *next;
    };

    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 {
    struct QueueNode *first;
    struct QueueNode *last;
    };

    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;
    }