-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpriority_queue.h
More file actions
132 lines (111 loc) · 3.04 KB
/
priority_queue.h
File metadata and controls
132 lines (111 loc) · 3.04 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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef PRIORITY_QUEUE_H_INCLUDED
#define PRIORITY_QUEUE_H_INCLUDED
#include <math.h>
#define N 16
#define TRUE 1
#define FALSE 0
typedef int bool;
typedef struct {
int value;
int priority;
} Element;
typedef struct {
int front;
int rear;
int size;
Element *data;
} pQueue;
void createPQueue (pQueue **queue) {
(*queue) = malloc(sizeof(pQueue));
(*queue)->front = 0;
(*queue)->rear = 0;
(*queue)->size = N;
(*queue)->data = malloc(sizeof(Element) * N);
}
void increaseSizeOfPQueue(pQueue *queue) {
queue->data = realloc(queue->data, sizeof(Element) * queue->size * 2);
queue->size *= 2;
}
void decreaseSizeOfPQueue(pQueue *queue) {
int count = 0;
int activeSize = getActiveSize(queue);
while(activeSize != 0) {
activeSize /= 2;
count++;
}
int newSize = pow(2, count);
count = 0;
Element *elements = malloc(sizeof(Element) * newSize);
for(int i=queue->front; i<queue->rear; i++) {
elements[count] = queue->data[i];
count++;
}
queue->data = elements;
queue->rear = count;
queue->front = 0;
queue->size = newSize;
}
bool isPQueueFull(pQueue *queue) {
if(queue->rear == queue->size - 1)
return TRUE;
return FALSE;
}
bool isPQueueEmpty(pQueue *queue) {
if(queue->front == queue->rear)
return TRUE;
return FALSE;
}
int getActiveSize(pQueue *queue) {
return queue->rear - queue->front;
}
void enqueueP (pQueue *queue, int value, int priority) {
Element e;
e.priority = priority;
e.value = value;
if(isPQueueFull(queue))
increaseSizeOfPQueue(queue);
queue->data[queue->rear] = e;
queue->rear = queue->rear + 1;
}
int getHighestPriority(pQueue *queue) {
int max = queue->data[0].priority;
int index = 0;
for(int i=queue->front; i<queue->rear; i++) {
if(queue->data[i].priority > max) {
max = queue->data[i].priority;
index = i;
}
}
return index;
}
int dequeueP (pQueue *queue) {
if(!isPQueueEmpty(queue)) {
int iPriority = getHighestPriority(queue);
int willBeReturned = queue->data[iPriority].value;
for(int i=iPriority; i<queue->rear; i++)
queue->data[i] = queue->data[i+1];
queue->rear = queue->rear - 1;
if(queue->size > getActiveSize(queue) * 2)
decreaseSizeOfPQueue(queue);
return willBeReturned;
}
return -1;
}
void updatePriority(pQueue *queue, int value) {
for(int i=queue->front; i<queue->rear; i++)
queue->data[i].priority += value;
}
bool searchInPQueue(pQueue *queue, int element) {
for(int i=queue->front; i<queue->rear; i++) {
if(queue->data[i].value == element)
return TRUE;
}
return FALSE;
}
void printPQueue(pQueue *queue, bool debug) {
for(int i=queue->front; i<queue->rear; i++)
printf("%d ", queue->data[i].value);
if(debug) printf("\nSize = %d, Active Size = %d\n", queue->size, getActiveSize(queue));
else printf("\n");
}
#endif // PQUEUE_H_INCLUDED