Refactor createNumbers and getDuplicate functions for improved error handling and code clarity

This commit is contained in:
D2A62006 2025-12-10 20:48:54 +01:00
parent 38e5ff6a0a
commit 11101adb0b

View File

@ -25,42 +25,43 @@ int compareUInts(const void *arg1, const void *arg2){
return 0; return 0;
} }
unsigned int* createNumbers(unsigned int len) unsigned int* createNumbers(unsigned int len)
{ {
if(len == 0){ if(len == 0){
return NULL; return NULL; //Check if len ist 0o
} }
unsigned int* numbers = (unsigned int*)malloc(len * sizeof(unsigned int)); unsigned int* numbers = (unsigned int*)malloc(len * sizeof(unsigned int)); //Allocate Memory for numbers Array
if(numbers == NULL){ if(numbers == NULL){
return NULL; return NULL; //Fallback if memory allocation error
} }
TreeNode *tree = NULL; TreeNode *tree = NULL;
unsigned int i = 0; unsigned int i = 0;
while(i < len){ while(i < len){
unsigned int tmp = (rand() % (2*len)) + 1; unsigned int tmp = (rand() % (2*len)) + 1; //Generate Random value
int isDuplicate = 0; int isDuplicate = 0;
tree = addToTree(tree, &tmp, sizeof(unsigned int), compareUInts, &isDuplicate); tree = addToTree(tree, &tmp, sizeof(unsigned int), compareUInts, &isDuplicate); //Add random value to tree
if(!isDuplicate){ if(!isDuplicate){
numbers[i] = tmp; numbers[i] = tmp; //Add number to array if no duplicate
i++; i++;
} }
} }
clearTree(tree); clearTree(tree); //Free Memory
unsigned int rIdx = rand() % len; unsigned int rIdx = rand() % len; //Select duplicate number
unsigned int duplicate = numbers[rIdx]; unsigned int duplicate = numbers[rIdx];
unsigned int tIdx = rand() % len; unsigned int tIdx = rand() % len;
while(tIdx == rIdx){ while(tIdx == rIdx){
tIdx = rand() % len; tIdx = rand() % len; //Select target index
} }
numbers[tIdx] = duplicate; numbers[tIdx] = duplicate;
return numbers; return numbers;
} }
@ -69,24 +70,27 @@ unsigned int* createNumbers(unsigned int len)
unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) unsigned int getDuplicate(const unsigned int numbers[], unsigned int len)
{ {
if(numbers == NULL || len < 2){ if(numbers == NULL || len < 2){
return 0; return 0; //Fallback
} }
unsigned int* sorted = (unsigned int*)malloc(len * sizeof(unsigned int)); unsigned int* sorted = (unsigned int*)malloc(len * sizeof(unsigned int)); //Allocate Memory for sorted array
if(sorted == NULL){ if(sorted == NULL){
return 0; return 0; //Fallback if memory allocation error
} }
//Create tree for duplicate search
TreeNode *tree = NULL; TreeNode *tree = NULL;
for(unsigned int i = 0; i < len; i++){ for(unsigned int i = 0; i < len; i++){
tree = addToTree(tree, &numbers[i], sizeof(unsigned int), compareUInts, NULL); tree = addToTree(tree, &numbers[i], sizeof(unsigned int), compareUInts, NULL);
} }
//Write sorted Elements from Tree to arary
sorted[0] = *(unsigned int *)nextTreeData(tree); sorted[0] = *(unsigned int *)nextTreeData(tree);
for(unsigned int j = 1; j < len; j++){ for(unsigned int j = 1; j < len; j++){
sorted[j] = *(unsigned int*)nextTreeData(NULL); sorted[j] = *(unsigned int*)nextTreeData(NULL);
} }
//Get duplicate
unsigned int duplicate = 0; unsigned int duplicate = 0;
for(unsigned int k = 0; k < len - 1; k++){ for(unsigned int k = 0; k < len - 1; k++){
if(sorted[k] == sorted[k+1]){ if(sorted[k] == sorted[k+1]){
@ -94,6 +98,10 @@ unsigned int getDuplicate(const unsigned int numbers[], unsigned int len)
break; break;
} }
} }
//Free memory
clearTree(tree);
free(sorted); free(sorted);
return duplicate; return duplicate;
} }