-
Notifications
You must be signed in to change notification settings - Fork 0
/
queue.c
64 lines (53 loc) · 1.63 KB
/
queue.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* Bounded queue implementation by Evan Brown in C for KPCB Fellow application. */
#include <stdlib.h>
#include <stdio.h>
struct queue
{
int capacity, current_size, front, elements[];
};
/* This method creates a queue and checks for a malloc error. */
struct queue * create_queue (const int max_elements)
{
struct queue *q = malloc (sizeof (struct queue) + sizeof (int) * max_elements);
if (!q)
{
fprintf (stderr, "Error: failure to allocate enough memory for queue!\n");
exit (EXIT_FAILURE);
}
// set capacity, current_size, and front index
q->capacity = max_elements;
q->current_size = q->front = 0;
return q;
}
/* This method adds an integer to the queue and checks that there is enough room for the new integer. */
void enqueue (struct queue *q, const int a)
{
if (q->capacity == q->current_size)
{
fprintf (stderr, "Error: queue is full!\n");
exit (EXIT_FAILURE);
}
// increment current size and assign argument to back of queue
q->elements[(q->front + q->current_size++) % q->capacity] = a;
}
/* This method removes an int from the front of the queue and checks that such an int exists. */
int dequeue (struct queue *q)
{
if (q->current_size == 0)
{
fprintf (stderr, "Error: queue is empty!\n");
exit (EXIT_FAILURE);
}
// decrement current_size, increment front index, and return integer from previous front of queue
--q->current_size;
int ret = q->elements[q->front];
if (++q->front == q->capacity) // check that new front is not past end of array
q->front = 0;
return ret;
}
/* This method frees the queue's array of elements. */
void delete_queue (struct queue *q)
{
if (q) // if q is not NULL
free (q);
}