diff --git a/bintree.c b/bintree.c index d4a26ff..079cad5 100644 --- a/bintree.c +++ b/bintree.c @@ -13,25 +13,46 @@ TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate) { if (root == NULL){ - Treenode *node = malloc(sizeof(Treenode)); - if (!node) + TreeNode *node = malloc(sizeof(TreeNode)); + if (!node){ return NULL; + } - node->date = malloc(dataSize) - if (!node->data) + node->data = malloc(dataSize); + if (!node->data){ + free (node); + return NULL; + } + + memcpy(node->data, data, dataSize); + + node->left = NULL; + node->right = NULL; + return node; + } + + int cmp = compareFct(data, root->data); + + if (cmp == 0){ + if (isDuplicate == NULL){ + root->right = addToTree(root->right, data, dataSize, compareFct, NULL); + return root; + } - - TreeNode *root = malloc(sizeof(TreeNode)); - - function createNode(data) - root = new TreeNode; - node -> data = data; - node -> left = NULL; - node -> right = NULL; + *isDuplicate = 1; return root; + } + + if (cmp < 0){ + root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); + } + else{ + 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. @@ -45,11 +66,27 @@ void *nextTreeData(TreeNode *root) // Releases all memory resources (including data copies). void clearTree(TreeNode *root) { + if (root == NULL){ + return; + } + clearTree(root->left); + clearTree(root->right); + + free(root->data); + free(root); } // Returns the number of entries in the tree given by root. unsigned int treeSize(const TreeNode *root) { + if (root == NULL){ + return 0; + } + unsigned int kidsleft = treeSize(root->left); + unsigned int kidsright = treeSize(root->right); + unsigned int size = kidsleft + kidsright + 1; + + return size; } \ No newline at end of file