aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--priority_queue.c26
-rw-r--r--priority_queue.h3
2 files changed, 29 insertions, 0 deletions
diff --git a/priority_queue.c b/priority_queue.c
index de6c179..6460a9e 100644
--- a/priority_queue.c
+++ b/priority_queue.c
@@ -67,6 +67,32 @@ Position ppq_pop(PositionPQ **ppq) {
return pos;
}
+void ppq_remove(PositionPQ **ppq, Position pos) {
+ PositionPQ *temp = *ppq;
+
+ if (temp == NULL) {
+ error("Tried to remove a pos from a NULL PositionPQ\n");
+ }
+
+ PositionPQ *prev = NULL;
+
+ while (temp->next != NULL && (pos.x != temp->pos.x || pos.y != temp->pos.y)) {
+ prev = temp;
+ temp = temp->next;
+ }
+
+ if (pos.x == temp->pos.x && pos.y == temp->pos.y) {
+ if (prev != NULL) {
+ prev->next = temp->next;
+ free(temp);
+ } else {
+ prev = *ppq;
+ *ppq = (*ppq)->next;
+ free(prev);
+ }
+ }
+}
+
void ppq_reprioritize(PositionPQ *ppq, Position pos, size_t priority) {
(void)ppq, (void)pos, (void)priority;
todo();
diff --git a/priority_queue.h b/priority_queue.h
index c121487..241dcc7 100644
--- a/priority_queue.h
+++ b/priority_queue.h
@@ -25,6 +25,9 @@ int ppq_insert(PositionPQ **ppq, Position pos, size_t priority);
/* Remove and return the position with the lowest priority */
Position ppq_pop(PositionPQ **ppq);
+/* Remove a given pos fron ppq */
+void ppq_remove(PositionPQ **ppq, Position pos);
+
/* Change the priority of a given pos, moving it to a different place in the
* linked list ("POTENTIALLY NOT NEEDED" since we don't use different weights */
void ppq_reprioritize(PositionPQ *ppq, Position pos, size_t priority);