diff options
| author | mo khan <mo.khan@gmail.com> | 2020-06-29 13:02:17 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-06-29 13:02:17 -0600 |
| commit | 7510ecbb65edfdb46a57169f3bedc21a3296dac5 (patch) | |
| tree | 8a060afd3b8923b452c03b365099b19848e4d00e /src/01 | |
| parent | c131d50cbdd8a0c7164de60bf03530c15ded9676 (diff) | |
Split src/test code
Diffstat (limited to 'src/01')
| -rw-r--r-- | src/01/01a/priority_queue.c | 68 | ||||
| -rw-r--r-- | src/01/01a/priority_queue.h | 20 | ||||
| -rw-r--r-- | src/01/01a/priority_queue_test.c | 86 |
3 files changed, 95 insertions, 79 deletions
diff --git a/src/01/01a/priority_queue.c b/src/01/01a/priority_queue.c index e69de29..f6e3364 100644 --- a/src/01/01a/priority_queue.c +++ b/src/01/01a/priority_queue.c @@ -0,0 +1,68 @@ +#include "priority_queue.h" +#include <stdlib.h> + +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; +} + +// This function is constant time O(1) +int size(PriorityQueue *queue) { + return queue->size; +} + +// This function is linear time O(n) +void add(PriorityQueue *queue, Node *node) { + queue->size++; + + if (queue->head == NULL) { + queue->head = node; + return; + } + + Node *tmp = queue->head; + Node *prev = NULL; + + while(tmp != NULL) { + if (tmp->data > node->data) { + node->next = tmp; + if (tmp == queue->head) + queue->head = node; + else if (prev != NULL) + prev->next = node; + break; + } + prev = tmp; + tmp = tmp->next; + } +} + +// This function is constant time O(1) +Node *delete_min(PriorityQueue *queue) { + Node *tmp = queue->head; + queue->head = tmp->next; + return tmp; +} + +void destroy(PriorityQueue *queue) { + Node *current = queue->head; + Node *tmp; + + while(current) { + tmp = current, current = current->next; + + if (tmp) free(tmp); + } + free(queue); +} + diff --git a/src/01/01a/priority_queue.h b/src/01/01a/priority_queue.h index e69de29..3228abd 100644 --- a/src/01/01a/priority_queue.h +++ b/src/01/01a/priority_queue.h @@ -0,0 +1,20 @@ +struct node { + int priority; + int data; + struct node *next; +}; + +typedef struct node Node; + +typedef struct { + Node *head; + int size; +} PriorityQueue; + + +PriorityQueue *initialize(); +Node *create_node(int priority, int data); +int size(PriorityQueue *queue); +void add(PriorityQueue *queue, Node *node); +Node *delete_min(PriorityQueue *queue); +void destroy(PriorityQueue *queue); diff --git a/src/01/01a/priority_queue_test.c b/src/01/01a/priority_queue_test.c index f754c33..f443142 100644 --- a/src/01/01a/priority_queue_test.c +++ b/src/01/01a/priority_queue_test.c @@ -1,5 +1,6 @@ #include <cgreen/cgreen.h> #include <string.h> +#include "priority_queue.h" /* Implement the methods of the priority queue interface using a singly-linked list. @@ -10,73 +11,6 @@ Implement the methods of the priority queue interface using a singly-linked list Analyze the running time of the `add(x)` and `deletMin()` operations based on this implementation. */ -struct node { - int priority; - int data; - struct node *next; -}; - -typedef struct node Node; - -typedef struct { - Node *head; - int size; -} PriorityQueue; - - -// https://en.wikipedia.org/wiki/Priority_queue -static PriorityQueue *initialize() { - PriorityQueue *queue = malloc(sizeof(PriorityQueue)); - queue->size = 0; - queue->head = NULL; - return queue; -} - -static Node *create_node(int priority, int data) { - Node *node = malloc(sizeof(Node)); - node->priority = priority; - node->data = data; - node->next = NULL; - return node; -} - -// This function is constant time O(1) -static int size(PriorityQueue *queue) { - return queue->size; -} - -// This function is linear time O(n) -static void add(PriorityQueue *queue, Node *node) { - queue->size++; - - if (queue->head == NULL) { - queue->head = node; - return; - } - - Node *tmp = queue->head; - Node *prev = NULL; - - while(tmp != NULL) { - if (tmp->data > node->data) { - node->next = tmp; - if (tmp == queue->head) - queue->head = node; - else if (prev != NULL) - prev->next = node; - break; - } - prev = tmp; - tmp = tmp->next; - } -} - -// This function is constant time O(1) -static Node *delete_min(PriorityQueue *queue) { - Node *tmp = queue->head; - queue->head = tmp->next; - return tmp; -} static void inspect(PriorityQueue *queue) { Node *tmp = queue->head; @@ -87,18 +21,6 @@ static void inspect(PriorityQueue *queue) { } } -static void destroy(PriorityQueue *queue) { - Node *current = queue->head; - Node *tmp; - - while(current) { - tmp = current, current = current->next; - - if (tmp) free(tmp); - } - free(queue); -} - Describe(PriorityQueue); BeforeEach(PriorityQueue){ } AfterEach(PriorityQueue){ } @@ -148,3 +70,9 @@ TestSuite *priority_queue_tests() { return suite; } + +int main(int argc, char **argv) { + TestSuite *suite = create_test_suite(); + add_suite(suite, priority_queue_tests()); + return run_test_suite(suite, create_text_reporter()); +} |
