aboutsummaryrefslogtreecommitdiff
path: root/src/queue.c
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2022-04-09 09:46:17 +0200
committerThomas Schmucker <ts@its1.de>2022-04-09 09:46:17 +0200
commit38f5e364f73967c01f9ed442fe6646e70cb1dde0 (patch)
tree274817eb2793584b0e3d856de5504a614f2b4e89 /src/queue.c
parent2863f4f1d2a6a6a8704454824d6c291d2e0d4b5c (diff)
parent154874afda4a8df885e51c01f7681f04fb0b8e61 (diff)
downloaddata-structures-38f5e364f73967c01f9ed442fe6646e70cb1dde0.tar.gz
data-structures-38f5e364f73967c01f9ed442fe6646e70cb1dde0.tar.bz2
data-structures-38f5e364f73967c01f9ed442fe6646e70cb1dde0.zip
Merge branch 'rework-directory-structure'
Diffstat (limited to 'src/queue.c')
-rw-r--r--src/queue.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/queue.c b/src/queue.c
new file mode 100644
index 0000000..6a472ee
--- /dev/null
+++ b/src/queue.c
@@ -0,0 +1,115 @@
1/* Standard C */
2#include <stdbool.h>
3#include <stdio.h>
4#include <stdlib.h>
5
6/* Project */
7#include "util.h"
8
9/* --8<-- queue_type */
10typedef int T;
11
12struct queue_item {
13 struct queue_item *next;
14 T data;
15};
16
17struct queue {
18 struct queue_item *head, *tail;
19};
20/* -->8-- */
21
22/* --8<-- queue_init */
23void
24queue_init(struct queue *queue)
25{
26 queue->head = NULL;
27}
28/* -->8-- */
29
30/* --8<-- queue_put */
31void
32queue_put(struct queue *queue, T data)
33{
34 struct queue_item *new_item;
35
36 if ( (new_item = malloc(sizeof *new_item)) != NULL ) {
37 struct queue_item *tmp = queue->tail;
38 new_item->data = data;
39 new_item->next = NULL;
40 queue->tail = new_item;
41 if ( queue->head == NULL )
42 queue->head = queue->tail;
43 else
44 tmp->next = queue->tail;
45 }
46 else {
47 ERROR("out of memory");
48 }
49}
50/* -->8-- */
51
52/* --8<-- queue_get */
53bool
54queue_get(struct queue *queue, T *data)
55{
56 if ( queue->head ) {
57 struct queue_item *next = queue->head->next;
58
59 if ( data ) {
60 *data = queue->head->data;
61 }
62 free(queue->head);
63 queue->head = next;
64
65 return true;
66 }
67 else
68 return false;
69}
70/* -->8-- */
71
72/* --8<-- queue_empty */
73bool
74queue_empty(struct queue *queue)
75{
76 return queue->head == NULL;
77}
78/* -->8-- */
79
80/* --8<-- queue_free */
81void
82queue_free(struct queue *queue)
83{
84 struct queue_item *item, *next;
85
86 for ( item = queue->head; item; item = next ) {
87 next = item->next;
88 free(item);
89 }
90}
91/* -->8-- */
92
93int
94main()
95{
96 struct queue queue[1];
97
98 queue_init(queue);
99
100 for ( int i = 0; i != 10; ++i ) {
101 queue_put(queue, i);
102 }
103
104 while ( !queue_empty(queue) ) {
105 int i;
106 if ( queue_get(queue, &i) )
107 printf("%d\n", i);
108 else
109 ERROR("this shouldn't happen!");
110 }
111
112 queue_free(queue);
113
114 return EXIT_SUCCESS;
115}