diff --git a/bintree.c b/bintree.c index 5cf82a9..9205425 100644 --- a/bintree.c +++ b/bintree.c @@ -12,7 +12,55 @@ // 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(root == NULL){ + //Allocate Memory for Node + TreeNode *newNode = calloc(1, sizeof(TreeNode)); + if(newNode == NULL){ + return NULL; //Memory allocation failed + } + //Allocate Memory for data + newNode->data = malloc(dataSize); + if(newNode->data == NULL){ + free(newNode); //Free unused Memory + return NULL;; //Memory allocation failed + } + newNode->data = data; //Copy Data + + newNode->left = NULL; + newNode->right = NULL; + + if(isDuplicate != NULL){ + *isDuplicate = 0; + } + + return newNode; + + } + int cmp = compareFct(root->data, data); + + if(cmp == 0){ + //Duplicate + if(isDuplicate != NULL){ + //Ignore duplicate + *isDuplicate = 1; + return root; + } else{ + //Accept duplicate + root->right = addToTree(root->right, data, dataSize, compareFct, NULL); + } + } + else if (cmp > 0) + { + //Data is smaller -> left + root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); + }else{ + //Data is bigger -> right + root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); + } + + 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.