-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqueue.c
More file actions
90 lines (80 loc) · 1.68 KB
/
queue.c
File metadata and controls
90 lines (80 loc) · 1.68 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//From assigment Document 3
#include "queue.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue {
uint32_t head;
uint32_t tail;
uint32_t size;
uint32_t capacity;
int64_t *items;
} Queue;
Queue *queue_create(uint32_t capacity) {
Queue *q = (Queue *) malloc(sizeof(Queue));
if (q) {
q->head = 0;
q->tail = 0;
q->size = 0;
q->capacity = capacity;
q->items = (int64_t *) calloc(capacity, sizeof(int64_t));
if (!q->items) {
free(q);
q = NULL;
}
}
return q;
}
void queue_delete(Queue **q) {
if (*q && (*q)->items) {
free((*q)->items);
free((*q));
*q = NULL;
}
return;
}
bool queue_empty(Queue *q) {
assert(q);
if (((q->head + 1) % q->capacity) == q->tail) {
return true;
}
return false;
}
bool queue_full(Queue *q) {
assert(q);
if (((q->head - q->tail) == q->capacity)) {
return true;
}
return false;
}
uint32_t queue_size(Queue *q) {
return q->size;
}
bool enqueue(Queue *q, int64_t x) {
assert(q);
if (!queue_full(q)) {
q->items[q->head] = x;
q->head = ((q->head + 1) % q->capacity);
q->size += 1;
return true;
}
return false;
}
bool dequeue(Queue *q, int64_t *x) {
assert(q);
if (!queue_empty(q)) {
*x = q->items[q->tail];
q->tail = ((q->tail + 1) % q->capacity);
q->size -= 1;
return true;
}
return false;
}
void queue_print(Queue *q) {
if (q) {
for (uint32_t i = 0; i < q->size; i++) {
printf("%u", ((q->tail + i) % q->capacity));
}
}
return;
}