From 6513b39520606a0eb0f48da8512af74d04ccf273 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 4 Dec 2025 21:02:14 +0100 Subject: [PATCH] addtotree funktion in bintree --- bintree.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ highscores.txt | 6 +++--- numbers.c | 15 ++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/bintree.c b/bintree.c index 5cf82a9..3f7e97c 100644 --- a/bintree.c +++ b/bintree.c @@ -12,7 +12,63 @@ // 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) { + // Teil 1: Trivialfall (Einfügen des neuen Knotens) + if(root == NULL) + { + // Speicher für den Knoten selbst reservieren + TreeNode *newNode = (TreeNode*)malloc(sizeof(TreeNode)); + if (newNode == NULL) + { + return NULL; // Fehler beim Allokieren + } + // Speicher für die Datenkopie reservieren + newNode->data = malloc(dataSize); + if (newNode->data == Null) + { + free(newNode); + return NULL; // Fehler beim Allokieren + } + + // Daten kopieren + memcpy(newNode->data, data, dataSize); + + // Initialisieren + newNode->left = NULL; + newNode->right = NULL; + + // Flag setzen und Knoten zurückgeben + if (isDuplicate != NULL) *isDuplicate = 0; + return newNode; + } + + // Teil 2: Rekursiver Fall (Vergleich) + int comparison = compareFct(data, root->data); + + if (comparison == 0) + { + // Duplikat gefunden + if (isDuplicate != NULL) *isDuplicate = 1; + // Duplikate werden akzeptiert, wenn isDuplicate == NULL (siehe bintree.h) + // Da wir aber in createNumbers Duplikate vermeiden wollen, geben wir hier einfach root zurück. + + // Wenn Duplikate erlaubt sind, könntest du hier einen zweiten Knoten einfügen, + // aber standardmäßig überspringen wir Duplikate, wenn isDuplicate gesetzt ist. + return root; + } + else if (comparison < 0) + { + // Wert ist kleiner -> gehe nach links + root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); + } + else // comparison > 0 + { + // Wert ist größer -> gehe nach rechts + root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); + } + + // 3. Wenn die Rekursion zurückkehrt, wird der aktuelle root-Pointer zurückgegeben. + 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. diff --git a/highscores.txt b/highscores.txt index 1cdb2b8..2fde905 100644 --- a/highscores.txt +++ b/highscores.txt @@ -1,10 +1,10 @@ player_name;19803 +player;19540 player_name;19102 player_test2;9976 player_test;9967 player;9960 player_name;9960 player_name;9953 -player_name;6966 -player1;3999 -player_name;2995 +miguel;9935 +player;9920 diff --git a/numbers.c b/numbers.c index 16ae61e..f431169 100644 --- a/numbers.c +++ b/numbers.c @@ -5,12 +5,27 @@ #include "numbers.h" #include "bintree.h" + + //TODO: getDuplicate und createNumbers implementieren /* * * Erzeugen eines Arrays mit der vom Nutzer eingegebenen Anzahl an Zufallszahlen. * Sicherstellen, dass beim Befüllen keine Duplikate entstehen. * Duplizieren eines zufälligen Eintrags im Array. * in `getDuplicate()`: Sortieren des Arrays und Erkennen der doppelten Zahl durch Vergleich benachbarter Elemente. */ +// Implementierung für unsigned int +int compareNumbers(const void *arg1, const void *arg2) +{ + // Die void-Pointer auf unsigned int Pointer casten + const unsigned int *num1 = (const unsigned int *)arg1; + const unsigned int *num2 = (const unsigned int *)arg2; + + // Werte dereferenzieren und vergleichen + if (*num1 < *num2) return -1; + if (*num1 > *num2) return 1; + return 0; +} + // Returns len random numbers between 1 and 2x len in random order which are all different, except for two entries. // Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while // creating random numbers.