aboutsummaryrefslogtreecommitdiff
path: root/queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'queue.c')
-rw-r--r--queue.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/queue.c b/queue.c
new file mode 100644
index 0000000..fdacca5
--- /dev/null
+++ b/queue.c
@@ -0,0 +1,86 @@
1/* Standard C */
2#include <stdio.h>
3#include <stdlib.h>
4#include <stdbool.h>
5
6/* Project */
7#include "util.h"
8
9typedef int T;
10
11struct queue_item {
12 struct queue_item *next;
13 T data;
14};
15
16struct queue {
17 struct queue_item *head, *tail;
18};
19
20void
21queue_init(struct queue *queue)
22{
23 queue->head = NULL;
24}
25
26void
27queue_put(struct queue *queue, T data)
28{
29 struct queue_item *new_item;
30
31 if ( (new_item = malloc(sizeof(*new_item))) != NULL ) {
32 struct queue_item *tmp = queue->tail;
33 new_item->data = data;
34 queue->tail = new_item;
35 if ( queue->head == NULL )
36 queue->head = queue->tail;
37 else
38 tmp->next = queue->tail;
39 }
40 else
41 ERROR("out of memory");
42}
43
44bool
45queue_get(struct queue *queue, T *data)
46{
47 if ( queue->head != NULL ) {
48 struct queue_item *next = queue->head->next;
49 *data = queue->head->data;
50 free(queue->head);
51 queue->head = next;
52
53 return true;
54 }
55 else
56 return false;
57}
58
59bool
60queue_empty(struct queue *queue)
61{
62 return queue->head == NULL;
63}
64
65int
66main()
67{
68 struct queue queue[1];
69
70 queue_init(queue);
71
72 for ( int i = 0; i != 10; ++i )
73 queue_put(queue, i);
74
75 while ( !queue_empty(queue) ) {
76 int i;
77 if ( queue_get(queue, &i) )
78 printf("%d\n", i);
79 else
80 ERROR("this shouldn't happen!");
81 }
82 return EXIT_SUCCESS;
83}
84
85
86