diff --git a/bintree.c b/bintree.c index 5cf82a9..6a95f4e 100644 --- a/bintree.c +++ b/bintree.c @@ -10,10 +10,43 @@ // Adds a copy of data's pointer destination to the tree using compareFct for ordering. Accepts duplicates // 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) -{ +// Hilfsfunktion: neuen Knoten erstellen und Daten kopieren +TreeNode* newNode(const void* data, size_t dataSize) { + TreeNode* node = malloc(sizeof(TreeNode)); + if (!node) return NULL; + + node->data = malloc(dataSize); + if (!node->data) { + free(node); + return NULL; + } + memcpy(node->data, data, dataSize); // Daten kopieren + node->left = node->right = NULL; + return node; } +TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, + CompareFctType compareFct, int *isDuplicate) +{ + if (root == NULL) { + *isDuplicate = 0; // kein Duplikat, neuer Knoten + return newNode(data, dataSize); // neuer Knoten wird Wurzel + } + + int result = compareFct(data, root->data); + + if (result < 0) { + root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); + } else if (result > 0) { + root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); + } else { + // result == 0 → Duplikat + *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. // Use your implementation of a stack to organize the iterator. Push the root node and all left nodes first. On returning the next element,