bintree add-function + Test

This commit is contained in:
Thomas Rauh Desktop
2025-11-22 19:08:57 +01:00
parent 7c89058ff1
commit da3bd18637
5 changed files with 115 additions and 1 deletions
+38
View File
@@ -12,7 +12,45 @@
// if isDuplicate is NULL, otherwise ignores duplicates and sets isDuplicate to 1 (or to 0 if a new entry is added).
TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate)
{
if (!data){
return NULL;
}
if (!root){
TreeNode *new = malloc(sizeof(TreeNode));
if (!new){
return NULL;
}
new->data = malloc(dataSize);
if (!new->data){
free(new);
return NULL;
}
memcpy(new->data, data, dataSize);
new->left = new->right = NULL;
if (isDuplicate){
*isDuplicate = 0;
}
return new;
}
int cmp = compareFct(data, root->data);
if (cmp < 0) {
root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate);
} else if (cmp > 0) {
root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate);
} else {
if (isDuplicate == NULL) {
root->left = addToTree(root->left, data, dataSize, compareFct, NULL);
} else {
*isDuplicate = 1;
}
}
return root;
}
// Iterates over the tree given by root. Follows the usage of strtok. If tree is NULL, the next entry of the last tree given is returned in ordering direction.
Binary file not shown.
+72
View File
@@ -0,0 +1,72 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "unity.h"
#include "bintree.h"
int compareInt(const void *arg1, const void *arg2) {
int a = *(const int *)arg1;
int b = *(const int *)arg2;
return a - b;
}
int compareString(const void *arg1, const void *arg2) {
const char *str1 = (const char *)arg1;
const char *str2 = (const char *)arg2;
return strcmp(str1, str2);
}
static void testAddToTreeNewRoot(){
TreeNode *root=NULL;
int a = 1;
root = addToTree(root,&a, sizeof(int),compareInt,0);
TEST_ASSERT_EQUAL_INT(a,*(int*)(root->data));
}
static void testAddToTreeToExistingRoot(){
TreeNode *root=NULL;
int a = 1;
int b = 3;
int c = 4;
int d = 2;
root = addToTree(root,&a, sizeof(int),compareInt,0);
root = addToTree(root,&b, sizeof(int),compareInt,0);
root = addToTree(root,&c, sizeof(int),compareInt,0);
root = addToTree(root,&d, sizeof(int),compareInt,0);
TEST_ASSERT_EQUAL_INT(a,*(int*)(root->data));
TEST_ASSERT_EQUAL_INT(b,*(int*)(root->right->data));
TEST_ASSERT_EQUAL_INT(c,*(int*)(root->right->right->data));
TEST_ASSERT_EQUAL_INT(d,*(int*)(root->right->left->data));
}
static void testAddToTreeNoData(){
TreeNode *root=NULL;
root = addToTree(root,NULL, sizeof(int),compareInt,0);
TEST_ASSERT_NULL(root);
}
void setUp(void){
}
void tearDown(void){
}
int main(){
UNITY_BEGIN();
printf("\n============================\nBintree tests\n============================\n");
RUN_TEST(testAddToTreeNewRoot);
RUN_TEST(testAddToTreeToExistingRoot);
RUN_TEST(testAddToTreeNoData);
return UNITY_END();
}
+4
View File
@@ -29,6 +29,10 @@ unitTests:
stackTests: stack.o stackTests.c $(unityfolder)/unity.c
$(CC) $(CFLAGS) -I$(unityfolder) -o runStackTests stackTests.c stack.o $(unityfolder)/unity.c
bintreeTests: stack.o bintree.o bintreeTests.c $(unityfolder)/unity.c
$(CC) $(CFLAGS) -I$(unityfolder) -o runBintreeTests bintreeTests.c stack.o bintree.o $(unityfolder)/unity.c
# --------------------------
# Clean
# --------------------------
Binary file not shown.