-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprioqueue.c
103 lines (93 loc) · 2.93 KB
/
prioqueue.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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "prioqueue.h"
#include "graph.h"
#include "dijkstra.h"
prioq_p create_prioq(graph_p graph_instance)
{
int i;
prioq_node *temp, *temp_p;
vrtx_node *vertexTemp;
prioq_p prioq_instance = (prioq_p) malloc(sizeof(prioq));
prioq_instance->head = NULL;
vertexTemp = graph_instance->vertices;
for (i = 0; i < graph_instance->no_vert; i++) {
temp_p = (prioq_node *) malloc(sizeof(prioq_node));
temp_p->distance = MAX_INT;
temp_p->vertex = vertexTemp->vertex;
vertexTemp = vertexTemp->next;
temp_p->next = NULL;
// This might cause some problems
if (prioq_instance->head == NULL) {
prioq_instance->head = temp_p;
} else {
temp = prioq_instance->head;
while (temp->next)
temp = temp->next;
temp->next = temp_p;
}
}
return prioq_instance;
}
int isempty(prioq_p prioq_instance)
{
if (prioq_instance->head == NULL)
return 1;
return 0;
}
void change_priority(prioq_p prioq_instance, char vertex, int distance)
{
// Here comes the sorting algorithm - well not exactly
prioq_node *pQNode,
*pQNodePrevious,
*pQNodeTemp,
*pQNodeTempPrevious;
pQNode = prioq_instance->head;
pQNodePrevious = prioq_instance->head;
while((pQNode->vertex != vertex) && (pQNode != NULL)) {
pQNodePrevious = pQNode;
pQNode = pQNode->next;
}
if (pQNode == NULL) {
fprintf(stdout, "Vertex was not found");
} else {
pQNode->distance = distance;
if (pQNode != prioq_instance->head) {
pQNodePrevious->next = pQNode->next;
} else {
prioq_instance->head = pQNode->next;
}
}
pQNodeTemp = prioq_instance->head;
pQNodeTempPrevious = prioq_instance->head;
while((pQNodeTemp != NULL) && (pQNodeTemp->distance < pQNode->distance)) {
pQNodeTempPrevious = pQNodeTemp;
pQNodeTemp = pQNodeTemp->next;
}
// No element was smaller than this one - pQNodeTemp
if (pQNodeTemp == NULL) {
if (pQNodePrevious == NULL) // This happens when the last element has been deleted
return;
pQNodeTempPrevious->next = pQNode;
pQNode->next = NULL;
return;
}
if (pQNodeTemp != prioq_instance->head) {
pQNodeTempPrevious->next = pQNode;
pQNode->next = pQNodeTemp;
}
if (pQNodeTemp == prioq_instance->head) {
pQNode->next = prioq_instance->head;
prioq_instance->head = pQNode;
}
return;
}
prioq_node *dequeue(prioq_p prioq_instance)
{
prioq_node *pQNode;
pQNode = prioq_instance->head;
if (prioq_instance->head != NULL)
prioq_instance->head = prioq_instance->head->next;
return pQNode;
}