From a74f52368cfce3559db5383f8a762707dc1290e0 Mon Sep 17 00:00:00 2001 From: Thilo Date: Wed, 10 Dec 2025 18:07:21 +0100 Subject: [PATCH] numbers.c finished --- numbers.c | 88 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 23 deletions(-) diff --git a/numbers.c b/numbers.c index 776a47f..39ed471 100644 --- a/numbers.c +++ b/numbers.c @@ -6,42 +6,84 @@ #include "bintree.h" //TODO: getDuplicate und createNumbers implementieren -/* 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. */ +/* * * * 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) { - unsigned int *array[len -1]; - unsigned int position; - unsigned int duplicate; - unsigned int pos_dup; + if (len < 2) + { + fprintf(stderr,"Fehler! Die Anzahl an Zahlen muss mindestens 2 sein!\n"); + return NULL; + } + + unsigned int *array = malloc(sizeof(unsigned int) * len); - srand(time(NULL)); + if (array == NULL) + { + fprintf(stderr,"Fehler! Der Speicher für das Array konnte nicht reserviert werden!\n"); + return NULL; + } + + unsigned int position; + unsigned int duplicate_value; + unsigned int pos_dup; + - for (unsigned int i = 1; i <= len; i++) - { - array[i-1] = rand() % (2*len) - 1; - } - - //TODO: sicherstellen, dass im Array keine doppelten Zahlen vorhanden sind (Max) - - position = rand() % len - 1; - duplicate = array[position]; - pos_dup = rand() % len - 1; + srand(time(NULL)); - if (pos_dup != position) - array[pos_dup] = array[position]; - - return array; - + for (unsigned int i = 0; i < len; i++) + { + array[i] = rand() % (2*len) + 1; + } + + //TODO: sicherstellen, dass im Array keine doppelten Zahlen vorhanden sind (Max) + + position = rand() % len; + duplicate_value = array[position]; + + do + { + pos_dup = rand() % len; + } while (pos_dup = duplicate_value); + + array[pos_dup] = array[position]; + + return array; } // 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 duplicate = 0; + if (numbers == NULL) + { + fprintf(stderr, "Fehler! Das übergebene Array ist leer!"); + return duplicate; + } + + if (len < 2) + { + fprintf(stderr,"Fehler! Die Anzahl an Zahlen muss mindestens 2 sein!\n"); + return duplicate; + } + + for (unsigned int i = 0; i < len - 1; i++) + { + for (unsigned int k = i + 1; k < len; k++) + { + if (numbers[i] == numbers[k]) + { + duplicate = numbers[k]; + return duplicate; + } + } + } + + return duplicate; } \ No newline at end of file