diff --git a/numbers.c b/numbers.c index 9c46779..a53c057 100644 --- a/numbers.c +++ b/numbers.c @@ -14,33 +14,69 @@ // 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. +// Returns len random numbers between 1 and 2*len in random order, +// all different, except for exactly one duplicate (two entries the same). +// Uses your binary search tree implementation to check for duplicates while generating numbers. unsigned int *createNumbers(unsigned int len) { - //Idee: Array mit while Schleife in Binaerbaum eintragen, dann Baum traversieren, um zu schauen, ob Element doppelt ist + if (len < 2) + return NULL; + srand(time(NULL)); - if(len>0) - { - unsigned int random; - int *duplicate = 0; - unsigned int *numbers = (unsigned int *)malloc(sizeof(unsigned int) * len); //erstellt ein Array mit der Laenge von len, ALternative: sizeofTree verwenden, um Groeße Array zu bestimmen - if(numbers == NULL) + + + unsigned int *numbers = malloc(len * sizeof(unsigned int)); + if (!numbers) + return NULL; + + TreeNode *root = NULL; // Baum anfänglich leer + unsigned int count = 0; + + // Zufallszahlen generieren, bis das Array voll ist + while (count < len) { + unsigned int random = (rand() % (2 * len)) + 1; + + int duplicate = 0; // Anfangswert für Duplikat-Check + root = addToTree(root, &random, sizeof(random), compareFct, &duplicate); + + if (root == NULL) { + free(numbers); return NULL; - for(unsigned int i=0;i