Skip to content

Queue Notes

mrtalley edited this page Oct 17, 2017 · 2 revisions

queue.h

#ifndef QUEUE_H
#define QUEUE_H

typedef struct queue_node {
  int value;
  struct queue_node_t* next;
} queue_node_t;

typedef struct queue {
  int size;
  queue_node_t* head, tail;
} queue_t;

int queue_init(queue_t* q);
int queue_delete(queue_t* q, int v);
int queue_add(queue_t* q, int* v);
int queue_remove(queue_t* q, int* v);
int queue_peek(queue_t* q);
int queue_size(queue_t* q);

#endif

queue.c

#include <stdio.h>
#include <stdlib.h>

#include "queue.h"

int queue_init(queue_t *q)
{
  q->size = 0;
  q->head = q->tail = NULL;

  return 0;
}

int queue_delete(queue_t *q)
{
  int i;

  while (!queue_remove(q, &i))
    ;

  return 0;
}

int queue_add(queue_t* q, int v)
{
  if (q->head) { // q is not empty
    if (!(q->tail->next = malloc(sizeof (*q->tail->next)))) {
      fprintf(stderr, "Out of memory.\n");

      return 1;
    }
    q->tail = q->tail->next;
    q->tail->value = v;
    q->tail->next = NULL;
    q->size++;

    return 0;
  } else {
    if (!(q->tail = q->head = malloc(sizeof (*q->tail)))) {
      fprintf(stderr, "Out of memory.\n");

      return 1;
    }
    q->tail->value = v;
    q->tail->next = NULL;
    q->size++;

    return 0;
  }

  return 0; // Won't be reached
}

int queue_remove(queue_t* q, int* v)
{
  queue_node_t* n;

  if (!q->size) {
    return 1;
  }

  n = q->head;

  q->head = q->head->next;
  q->size--;
  *v = n->value;
  free(n);

  if (!q->size) {
    q->tail = NULL;
  }

  return 0;
}

int queue_peek(queue_t *q, int *v)
{
  if (q->size) {
    *v = q->head->value;

    return 0;
  }

  return 1;
}

int queue_size(queue_t *q)
{
  return q->size;
}
```*

### main.c
```C
    #include <stdio.h>

    #include "queue.h"

    int main(int argc, char *argv[]) {
        queue_t q;

        queue_init(&q);

        queue_add(&q, 0);
        queue_add(&q, 1);
        queue_add(&q, 2);
        queue_add(&q, 3);
        queue_add(&q, 4);

        while(!queue_remove(&q, &i)) {
            printf("Removed %d", i);
        }

        queue_delete(&q);

        return 0;
    }
Clone this wiki locally