Commit 473b0f0
Changed files (3)
assignments
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;
}