diff options
Diffstat (limited to 'src/02')
| -rw-r--r-- | src/02/05/Makefile | 38 | ||||
| -rw-r--r-- | src/02/05/btree.c | 43 | ||||
| -rw-r--r-- | src/02/05/btree.h | 15 | ||||
| -rw-r--r-- | src/02/05/btree_test.c | 119 | ||||
| -rw-r--r-- | src/02/05/main.c | 10 |
5 files changed, 225 insertions, 0 deletions
diff --git a/src/02/05/Makefile b/src/02/05/Makefile new file mode 100644 index 0000000..6742545 --- /dev/null +++ b/src/02/05/Makefile @@ -0,0 +1,38 @@ +#!/usr/bin/make -f +SHELL=/bin/sh + +CC=clang +CFLAGS=-std=c99 +TEST_LIBS = -lcgreen + +BUILDDIR := build +OBJS := $(addprefix $(BUILDDIR)/,btree.o) +TEST_OBJS := $(addprefix $(BUILDDIR)/,btree_test.o) + +$(BUILDDIR)/%.o : %.c + $(COMPILE.c) $(OUTPUT_OPTION) $< + +.PHONY: all +all: $(OBJS) $(BUILDDIR)/main.o + $(CC) $(OBJS) $(BUILDDIR)/main.o -o $(BUILDDIR)/program + +.PHONY: test +test: $(OBJS) $(TEST_OBJS) + $(CC) $(OBJS) $(TEST_OBJS) $(TEST_LIBS) -o $(BUILDDIR)/test + +$(OBJS): | $(BUILDDIR) + +$(TEST_OBJS): | $(BUILDDIR) + +$(BUILDDIR): + mkdir $(BUILDDIR) + +.PHONY: clean +clean: + rm -fr build + +run : all + ./build/program + +run_test : test + cgreen-runner -c -v $(BUILDDIR)/test diff --git a/src/02/05/btree.c b/src/02/05/btree.c new file mode 100644 index 0000000..7dea5b8 --- /dev/null +++ b/src/02/05/btree.c @@ -0,0 +1,43 @@ +#include "btree.h" +#include <limits.h> +#include <stdio.h> + +static void inspect(BTree *tree, int level) { + if (!tree) + return; + + for (int i = 0; i < level; i++) + printf(" "); + + printf("%2d\n", tree->data); + inspect(tree->left, level + 1); + inspect(tree->right, level + 1); +} + +BTree *btree_init(int data) { + BTree *tree = malloc(sizeof(BTree)); + tree->left = NULL; + tree->right = NULL; + tree->data = data; + return tree; +} + +BTree *btree_insert(BTree *tree, int data) { + if (!tree) + return btree_init(data); + + if (data <= tree->data) + if (tree->left) + btree_insert(tree->left, data); + else + tree->left = btree_init(data); + else + if (tree->right) + btree_insert(tree->right, data); + else + tree->right = btree_init(data); + + return tree; +} + +void btree_inspect(BTree *tree) { inspect(tree, 0); } diff --git a/src/02/05/btree.h b/src/02/05/btree.h new file mode 100644 index 0000000..ac0de3c --- /dev/null +++ b/src/02/05/btree.h @@ -0,0 +1,15 @@ +#include <stdlib.h> +#include <stdbool.h> + +typedef struct btree_node { + struct btree_node *left; + struct btree_node *right; + int *in_order; + int *post_order; + int *pre_order; + int data; +} BTree; + +BTree *btree_init(int data); +BTree *btree_insert(BTree *root, int data); +void btree_inspect(BTree *tree); diff --git a/src/02/05/btree_test.c b/src/02/05/btree_test.c new file mode 100644 index 0000000..70184a5 --- /dev/null +++ b/src/02/05/btree_test.c @@ -0,0 +1,119 @@ +#include "btree.h" +#include <cgreen/cgreen.h> +#include <string.h> + +Describe(BinaryTree); +BeforeEach(BinaryTree) {} +AfterEach(BinaryTree) {} + +Ensure(BinaryTree, when_the_tree_is_NULL) { + BTree *tree = btree_insert(NULL, 10); + + assert_that(tree, is_not_equal_to(NULL)); + assert_that(tree->data, is_equal_to(10)); +} + +Ensure( + BinaryTree, + when_inserting_an_item_less_than_the_root_in_a_tree_it_creates_a_node_on_the_left_side) { + BTree *tree = btree_init(10); + btree_insert(tree, -5); + + assert_that(tree->left, is_not_equal_to(NULL)); + assert_that(tree->left->data, is_equal_to(-5)); +} + +Ensure( + BinaryTree, + when_inserting_an_item_greater_than_the_root_in_a_tree_it_creates_a_node_on_the_right_side) { + BTree *tree = btree_init(10); + + btree_insert(tree, 16); + + assert_that(tree->right, is_not_equal_to(NULL)); + assert_that(tree->right->data, is_equal_to(16)); +} + +Ensure( + BinaryTree, + when_inserting_an_item_equal_to_the_root_in_a_tree_it_creates_a_node_on_the_left_side) { + BTree *tree = btree_init(10); + + btree_insert(tree, 10); + + assert_that(tree->left, is_not_equal_to(NULL)); + assert_that(tree->left->data, is_equal_to(10)); +} + +Ensure( + BinaryTree, + when_inserting_multiple_items_into_a_tree_it_inserts_in_the_correct_position) { + BTree *tree = btree_insert(NULL, 10); + + btree_insert(tree, -5); + btree_insert(tree, 16); + + assert_that(tree->data, is_equal_to(10)); + assert_that(tree->left->data, is_equal_to(-5)); + assert_that(tree->right->data, is_equal_to(16)); + + btree_insert(tree, -8); + + assert_that(tree->left->left, is_not_equal_to(NULL)); + assert_that(tree->left->left->data, is_equal_to(-8)); + + btree_insert(tree, 7); + + assert_that(tree->left->right, is_not_equal_to(NULL)); + assert_that(tree->left->right->data, is_equal_to(7)); + + btree_insert(tree, 18); + + assert_that(tree->right->right, is_not_equal_to(NULL)); + assert_that(tree->right->right->data, is_equal_to(18)); + + btree_insert(tree, 6); + + assert_that(tree->left->right->left, is_not_equal_to(NULL)); + assert_that(tree->left->right->left->data, is_equal_to(6)); +} + +Ensure( + BinaryTree, + when_inserting_items_described_in_the_assignment_it_inserts_in_the_expected_position_in_the_tree) { + BTree *tree = btree_insert(NULL, 1); + tree = btree_insert(tree, 5); + tree = btree_insert(tree, 2); + tree = btree_insert(tree, 4); + tree = btree_insert(tree, 3); + + assert_that(tree, is_not_equal_to(NULL)); +} + +TestSuite *btree_tests() { + TestSuite *suite = create_test_suite(); + add_test_with_context(suite, BinaryTree, when_the_tree_is_NULL); + add_test_with_context( + suite, BinaryTree, + when_inserting_an_item_less_than_the_root_in_a_tree_it_creates_a_node_on_the_left_side); + add_test_with_context( + suite, BinaryTree, + when_inserting_an_item_greater_than_the_root_in_a_tree_it_creates_a_node_on_the_right_side); + add_test_with_context( + suite, BinaryTree, + when_inserting_an_item_equal_to_the_root_in_a_tree_it_creates_a_node_on_the_left_side); + add_test_with_context( + suite, BinaryTree, + when_inserting_multiple_items_into_a_tree_it_inserts_in_the_correct_position); + add_test_with_context( + suite, BinaryTree, + when_inserting_items_described_in_the_assignment_it_inserts_in_the_expected_position_in_the_tree); + return suite; +} + + +int main(int argc, char **argv) { + TestSuite *suite = create_test_suite(); + add_suite(suite, btree_tests()); + return run_test_suite(suite, create_text_reporter()); +} diff --git a/src/02/05/main.c b/src/02/05/main.c new file mode 100644 index 0000000..05abac6 --- /dev/null +++ b/src/02/05/main.c @@ -0,0 +1,10 @@ +#include "btree.h" +#include <stdio.h> +#include <stdlib.h> + +int main(int argc, char *argv[]) { + printf("=== COMP-272 - Assignment 02 - Question 05 ===\n"); + + printf("Bye\n"); + return 0; +} |
