RosettaCodeData/Task/Queue-Definition/C/queue-definition-2.c

44 lines
738 B
C
Raw Permalink Normal View History

2013-04-10 23:57:08 -07:00
#include <stdio.h>
#include <stdlib.h>
typedef struct node_t node_t, *node, *queue;
struct node_t { int val; node prev, next; };
#define HEAD(q) q->prev
#define TAIL(q) q->next
queue q_new()
{
2014-01-17 05:32:22 +00:00
node q = malloc(sizeof(node_t));
q->next = q->prev = 0;
return q;
2013-04-10 23:57:08 -07:00
}
int empty(queue q)
{
2014-01-17 05:32:22 +00:00
return !HEAD(q);
2013-04-10 23:57:08 -07:00
}
void enqueue(queue q, int n)
{
2014-01-17 05:32:22 +00:00
node nd = malloc(sizeof(node_t));
nd->val = n;
if (!HEAD(q)) HEAD(q) = nd;
nd->prev = TAIL(q);
if (nd->prev) nd->prev->next = nd;
TAIL(q) = nd;
nd->next = 0;
2013-04-10 23:57:08 -07:00
}
int dequeue(queue q, int *val)
{
2014-01-17 05:32:22 +00:00
node tmp = HEAD(q);
if (!tmp) return 0;
*val = tmp->val;
2013-04-10 23:57:08 -07:00
2014-01-17 05:32:22 +00:00
HEAD(q) = tmp->next;
if (TAIL(q) == tmp) TAIL(q) = 0;
free(tmp);
2013-04-10 23:57:08 -07:00
2014-01-17 05:32:22 +00:00
return 1;
2013-04-10 23:57:08 -07:00
}