Commit 473b0f0

mo khan <mo.khan@gmail.com>
2020-06-16 03:52:23
Implement priority_queue.delete_min
1 parent 4a14b74
assignments/01/priority_queue.c
@@ -4,12 +4,15 @@
 PriorityQueue *initialize() {
   PriorityQueue *queue = malloc(sizeof(PriorityQueue));
   queue->size = 0;
+  queue->head = NULL;
   return queue;
 }
+
 Node *create_node(int priority, int data) {
   Node *node = malloc(sizeof(Node));
   node->priority = priority;
   node->data = data;
+  node->next = NULL;
   return node;
 }
 
@@ -19,4 +22,26 @@ int count(PriorityQueue *queue) {
 
 void add(PriorityQueue *queue, Node *node) {
   queue->size++;
+
+  if (queue->head == NULL) {
+    queue->head = node;
+    return;
+  }
+
+  Node *tmp = queue->head;
+
+  while(tmp != NULL) {
+    if (tmp->data > node->data) {
+      tmp->next = node;
+      if (tmp == queue->head) {
+        queue->head = node;
+      }
+      break;
+    }
+    tmp = tmp->next;
+  }
+}
+
+Node *delete_min(PriorityQueue *queue) {
+  return queue->head;
 }
assignments/01/priority_queue.h
@@ -1,9 +1,13 @@
-typedef struct {
+struct node {
   int priority;
   int data;
-} Node;
+  struct node *next;
+};
+
+typedef struct node Node;
 
 typedef struct {
+  Node *head;
   int size;
 } PriorityQueue;
 
@@ -12,3 +16,4 @@ PriorityQueue *initialize();
 Node *create_node(int priority, int data);
 int count(PriorityQueue *queue);
 void add(PriorityQueue *queue, Node *node);
+Node *delete_min(PriorityQueue *queue);
assignments/01/priority_queue_test.c
@@ -35,9 +35,31 @@ Ensure(PriorityQueue, adds_a_node) {
   free(queue);
 }
 
+Ensure(PriorityQueue, removes_the_node_with_the_lowest_priority){
+  PriorityQueue *queue = initialize();
+  Node *min = create_node(1, 100);
+  Node *mid = create_node(2, 200);
+  Node *max = create_node(3, 300);
+
+  add(queue, max);
+  add(queue, min);
+  add(queue, mid);
+
+  assert_that(count(queue), is_equal_to(3));
+
+  Node *deleted = delete_min(queue);
+  assert_that(deleted, is_equal_to(min));
+
+  free(max);
+  free(mid);
+  free(min);
+  free(queue);
+};
+
 TestSuite *priority_queue_tests() {
   TestSuite *suite = create_test_suite();
   add_test_with_context(suite, PriorityQueue, returns_size);
   add_test_with_context(suite, PriorityQueue, adds_a_node);
+  add_test_with_context(suite, PriorityQueue, removes_the_node_with_the_lowest_priority);
   return suite;
 }