#include #include #include #include #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. */ // 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. unsigned int *createNumbers(unsigned int len){ if(len == 1){ printf("Minimum length is 2"); return NULL; } srand(time(NULL)); unsigned int *numbers = malloc(len * sizeof(unsigned int)); //reserving memory for array if(!numbers){ printf("Error allocating Memory"); return NULL; } for (int i = 0; i < len; i++){ numbers[i] = rand() % (2 * len) + 1; //creates randorm number between 1 and 2x len if(getDuplicate(numbers, i+1)){ //We use i+1 to refer to current initialised array length i--; //If there a douplicate has been created, i gets 1 lower therefore overwriting it in next iteration } } //Creating Duplicate unsigned int duplicationSuccess = 0; while (duplicationSuccess == 0){ unsigned int duplicateInitialIndex = rand()%len; //Getting random index for creating duplicate unsigned int duplicateReplaceIndex = rand ()%len; //Index of Number replaced by duplicateInitialIndex if(duplicateInitialIndex == duplicateReplaceIndex) continue; //returning process if chosen duplicate is replacing itsself duplicationSuccess = 1; numbers[duplicateReplaceIndex] = numbers [duplicateInitialIndex]; } return numbers; } // Returns only the only number in numbers which is present twice. Returns zero on errors. unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) { unsigned int *sortedNumbers = malloc(len * sizeof(unsigned int)); if(!sortedNumbers){ printf("Error allocating memory"); return 0; } //Creating Copy of Numbers Array for (int i = 0; i < len; i++){ sortedNumbers[i] = numbers[i]; } unsigned int duplicate = 0; unsigned int temp = 0; unsigned int duplicateCount = 0; //Sorting sortedNumbers for (int i = 0; i < len; i++){ for(int j = 0; j< len - 1; j++){ if(sortedNumbers[j]> sortedNumbers[j+1]){ //Switching Elements temp = sortedNumbers[j]; sortedNumbers[j] = sortedNumbers[j+1]; sortedNumbers[j+1] = temp; } } } //identifying duplicates for(int i = 0; i < len; i++){ if(sortedNumbers[i] == sortedNumbers[i+1]){ duplicate = sortedNumbers[i]; duplicateCount++; } } free(sortedNumbers); if(duplicateCount != 1){ return 0; } return duplicate; }