-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathqueue.c
105 lines (95 loc) · 2.59 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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/**
* Implementation of a basic queue structure.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "queue.h"
Queue *initQueue(int (*destroy)(void *data), char *(*toString)(void *data),
int (*compare)(void *key1, void *key2)) {
Queue *newQueue;
if ((newQueue = malloc(sizeof(Queue))) == NULL) {
fprintf(stderr, "ERROR: Couldn't malloc for new Queue\n");
newQueue = NULL;
}
else {
newQueue->size = 0;
newQueue->destroy = destroy;
newQueue->toString = toString;
newQueue->compare = compare;
newQueue->head = NULL;
newQueue->tail = NULL;
}
return newQueue;
}
QueueItem *initQueueItem(void *data) {
QueueItem *newItem;
if ((newItem = malloc(sizeof(QueueItem))) == NULL) {
fprintf(stderr, "ERROR: Couldn't malloc for new QueueItem\n");
newItem = NULL;
}
else {
newItem->data = data;
newItem->next = NULL;
}
return newItem;
}
QueueItem *freeQueueItem(Queue *queue, QueueItem *queueItem) {
destroyQueueItem(queue, queueItem);
QueueItem *next = queueItem->next;
free(queueItem);
return next;
}
void enqueue(Queue *queue, void *data) {
QueueItem *newItem;
if ((newItem = initQueueItem(data)) == NULL) {
fprintf(stderr, "ERROR: Couldn't init new QueueItem to enqueue\n");
}
else {
if (queue->size == 0) {
queue->tail = newItem;
queue->head = queue->tail;
}
else {
queue->tail->next = newItem;
queue->tail = newItem;
}
(queue->size)++;
}
}
void *dequeue(Queue *queue) {
if (queue->size == 0) {
fprintf(stderr, "ERROR: Queue is empty; nothing to dequeue\n");
return NULL;
}
QueueItem *front = queue->head;
queue->head = front->next;
(queue->size)--;
if (queue->size == 0)
queue->tail = queue->head; // both should point to NULL
void *frontdata = front->data;
free(front);
return frontdata;
}
void *peekQueue(Queue *queue) {
if (queue->head != NULL)
return queue->head->data;
else
return NULL;
}
void queuePrint(Queue *queue) {
QueueItem *itemPtr = queue->head;
for (itemPtr; itemPtr != NULL; itemPtr = itemPtr->next)
queueItemPrint(queue, itemPtr);
}
void queueItemPrint(Queue *queue, QueueItem *queueItem) {
printf("%s\n", (queue->toString)(queueItem->data));
}
void freeQueue(Queue *queue) {
QueueItem *itemPtr = queue->head;
while (itemPtr != NULL) {
itemPtr = freeQueueItem(queue, itemPtr);
}
free(queue);
}