Commit 0e02f8d
Changed files (5)
assignments/01/01_a_priority_queue.rb
@@ -1,34 +0,0 @@
-require 'bundler/inline'
-
-gemfile do
- source 'https://rubygems.org'
-
- gem 'minitest'
-end
-
-require 'minitest/autorun'
-
-=begin
-Describe the meaning of the essential methods `add(x)`, `deleteMin()`, and `size()` that are supported by the priority queue interface.
-Implement those methods using a singly-linked list.
-Analyze the running time of the `add(x)` and `deletMin()` operations based on this implementation.
-=end
-
-class Example < Minitest::Test
- def dyck_word?(stack)
- sum = 0
- stack.each do |item|
- return if sum.negative?
- sum += item
- end
- true
- end
-
- def test_valid_word
- assert dyck_word?([1, -1, 1, -1])
- end
-
- def test_invalid_word
- refute dyck_word?([1, -1, -1, 1])
- end
-end
assignments/01/priority_queue.c
@@ -1,78 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include "priority_queue.h"
-
-// https://en.wikipedia.org/wiki/Priority_queue
-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 inspect(PriorityQueue *queue) {
- Node *tmp = queue->head;
-
- while(tmp) {
- printf("%d\n", tmp->data);
- tmp = tmp->next;
- }
-}
-
-void destroy(PriorityQueue *queue) {
- Node *current = queue->head;
- Node *tmp;
-
- while(current) {
- tmp = current, current = current->next;
-
- if (tmp) free(tmp);
- }
- free(queue);
-}
assignments/01/priority_queue.h
@@ -1,20 +0,0 @@
-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 inspect(PriorityQueue *queue);
-void destroy(PriorityQueue *queue);
assignments/01/priority_queue_test.c
@@ -1,8 +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.
@@ -12,6 +10,94 @@ 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;
+
+ while(tmp) {
+ printf("%d\n", tmp->data);
+ tmp = tmp->next;
+ }
+}
+
+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){ }
Makefile
@@ -13,8 +13,8 @@ doc : doc/
run : main
./main
-main : main.o words_test.o words.o priority_queue.o priority_queue_test.o stack_test.o
- $(CC) main.o words_test.o words.o priority_queue.o priority_queue_test.o stack_test.o -lcgreen -o main
+main : main.o words_test.o words.o priority_queue_test.o stack_test.o
+ $(CC) main.o words_test.o words.o priority_queue_test.o stack_test.o -lcgreen -o main
main.o : main.c
$(CC) -c main.c
@@ -25,9 +25,6 @@ words.o : words.c
words_test.o : words_test.c
$(CC) -c words_test.c
-priority_queue.o : assignments/01/priority_queue.c
- $(CC) -c assignments/01/priority_queue.c
-
priority_queue_test.o : assignments/01/priority_queue_test.c
$(CC) -c assignments/01/priority_queue_test.c