diff --git a/I2_Dobble/numbers.c b/I2_Dobble/numbers.c index f59d9a2..5817686 100644 --- a/I2_Dobble/numbers.c +++ b/I2_Dobble/numbers.c @@ -14,13 +14,74 @@ // 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. +static int compare(const void *a, const void *b) +{ + return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b); +} + unsigned int *createNumbers(unsigned int len) { + if (len < 2) + return NULL; + unsigned int *numbers = malloc(sizeof(unsigned int) * len); + + if (!numbers) + return NULL; + + srand(time(NULL)); + + TreeNode *root = NULL; + + unsigned int i = 0; + while (i < len - 1) + { + unsigned int val = (rand() % (2 * len)) + 1; + int isDup = 0; + + root = addToTree(root, &val, sizeof(unsigned int), compare, &isDup); + + if (!isDup) + { + numbers[i++] = val; + } + } + + // Duplicate one random entry + unsigned int dupIndex = rand() % (len - 1); + numbers[len - 1] = numbers[dupIndex]; + + clearTree(root); //Notwendigkeit muss noch restlichem Code entnommen werden + 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) { + if (!numbers || len < 2) + return 0; -} \ No newline at end of file + unsigned int *numbersCopy = malloc(sizeof(unsigned int) * len); + if (!numbersCopy) + return 0; + + for (unsigned int i = 0; i < len; i++) + { + numbersCopy[i] = numbers[i]; + } + + qsort(numbersCopy, len, sizeof(unsigned int), compare); + + unsigned int duplicate = 0; + for (unsigned int i = 0; i < len - 1; i++) + { + if (numbersCopy[i] == numbersCopy[i+1]) + { + duplicate = numbersCopy[i]; + break; + } + } + + free(numbersCopy); + return duplicate; +}