APPFS
Advanced practical programming for scientists
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
queue.c
Go to the documentation of this file.
1 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <assert.h>
14 
15 #include "allocate.h"
16 #include "queue.h"
17 
23 struct queue
24 {
25  int size;
26  int used;
27  int first;
28  int next;
29  int* elem;
30 };
31 
35 static bool queue_is_valid(const Queue* queue)
36 {
37  return queue != NULL
38  && queue->size > 0 && queue->elem != NULL
39  && queue->used >= 0 && queue->used < queue->size
40  && queue->first >= 0 && queue->first < queue->size
41  && queue->next >= 0 && queue->next < queue->size
42  && (queue->first + queue->used) % queue->size == queue->next
43  && ( (queue->used > 0 && queue->first != queue->next)
44  || (queue->used == 0 && queue->first == queue->next));
45 }
46 
53 Queue* queue_new(int size)
54 {
55  Queue* queue;
56 
57  assert(size > 0);
58 
59  queue = allocate(1, sizeof(*queue));
60 
61  queue->size = size + 1;
62  queue->used = 0;
63  queue->first = 0;
64  queue->next = 0;
65  queue->elem = allocate(queue->size, sizeof(*queue->elem));
66 
67  assert(queue_is_valid(queue));
68 
69  return queue;
70 }
71 
78 {
79  assert(queue_is_valid(queue));
80 
81  deallocate(queue->elem);
82  deallocate(queue);
83 }
84 
91 void queue_put(Queue* queue, int element)
92 {
93  assert(queue_is_valid(queue));
94 
95  if (queue->used == queue->size - 1)
96  {
97  fprintf(stderr, "Queue overflow size=%d\n", queue->size);
98  abort();
99  }
100  assert(queue->used < queue->size - 1);
101 
102  queue->elem[queue->next] = element;
103  queue->next = (queue->next + 1) % queue->size;
104  queue->used++;
105 
106  assert(queue_is_valid(queue));
107 }
108 
116 {
117  int element;
118 
119  assert(queue_is_valid(queue));
120 
121  if (queue->used == 0)
122  return -1;
123 
124  element = queue->elem[queue->first];
125  queue->first = (queue->first + 1) % queue->size;
126  queue->used--;
127 
128  assert(queue_is_valid(queue));
129 
130  return element;
131 }
132 
141 {
142  assert(queue_is_valid(queue));
143 
144  return queue->used == 0;
145 }
146 
int queue_get(Queue *queue)
Holt das vordersten Element aus der Queue heraus.
Definition: queue.c:115
void queue_free(Queue *queue)
Gibt eine Queue wieder frei.
Definition: queue.c:77
void queue_put(Queue *queue, int element)
Hängt eine neues Element an das Ende der Queue an.
Definition: queue.c:91
int first
Erstes Element der Queue, wird als nächstes gelesen.
Definition: queue.c:27
int next
Letztes Element der Queue, hiernach kommen neue Elemente.
Definition: queue.c:28
int used
Aktuelle Anzahl von Elementen in der Queue.
Definition: queue.c:26
Queue * queue_new(int size)
Erzeugt eine neue Queue.
Definition: queue.c:53
void deallocate(void *p)
Free allocated memory.
Definition: allocate.c:47
Queue oder FIFO (First In, First Out) Liste.
Definition: queue.c:23
Wrapper for malloc.
Queue Implementierung.
static bool queue_is_valid(const Queue *queue)
Definition: queue.c:35
void * allocate(int elems, int size)
Allocate memory.
Definition: allocate.c:23
bool queue_is_empty(const Queue *queue)
Stellt fest, ob eine Queue leer ist.
Definition: queue.c:140
int * elem
Der Vektor mit den Elementen.
Definition: queue.c:29
int size
Maximale Anzahl von Elementen in der Queue.
Definition: queue.c:25