Compare commits

..

No commits in common. "Simon" and "main" have entirely different histories.
Simon ... main

7 changed files with 8 additions and 242 deletions

View File

@ -12,22 +12,7 @@
// if isDuplicate is NULL, otherwise ignores duplicates and sets isDuplicate to 1 (or to 0 if a new entry is added). // if isDuplicate is NULL, otherwise ignores duplicates and sets isDuplicate to 1 (or to 0 if a new entry is added).
TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate) TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate)
{ {
if(root == NULL){
TreeNode *node;
node = (TreeNode*)malloc(sizeof(TreeNode));
if(node == NULL){
return NULL;
}
node->data = malloc(dataSize);
if(node->data == NULL){
free(node);
return NULL;
}
memcpy(node->data, data, dataSize);
node->left;
node->right;
}
} }
// Iterates over the tree given by root. Follows the usage of strtok. If tree is NULL, the next entry of the last tree given is returned in ordering direction. // Iterates over the tree given by root. Follows the usage of strtok. If tree is NULL, the next entry of the last tree given is returned in ordering direction.

View File

@ -35,20 +35,8 @@ $(program_obj_filesobj_files): %.o: %.c
# -------------------------- # --------------------------
# Unit Tests # Unit Tests
# -------------------------- # --------------------------
unitTests: stacktest unitTests:
echo "needs to be implemented"
test_stack: stacktest.o stack.o
$(CC) $(FLAGS) $^ -o stacktest
test_numbers: numberstest.o numbers.o
$(CC) $(FLAGS) $^ -o numberstest
test_stack.o: stacktest.c
$(CC) -c $(FLAGS) $< -o $@
test_numbers.o: numberstest.c
$(CC) -c $(FLAGS) $< -o $@
# -------------------------- # --------------------------
# Clean # Clean

View File

@ -1,4 +1,3 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
@ -15,69 +14,13 @@
// Returns len random numbers between 1 and 2x len in random order which are all different, except for two entries. // 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 // Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while
// creating random numbers. // creating random numbers.
int compare(const void* a, const void* b) {
return (*(unsigned int*)a - *(unsigned int*)b);
}
unsigned int *createNumbers(unsigned int len) unsigned int *createNumbers(unsigned int len)
{ {
//array erstellen
if(len < 2)
return NULL;
unsigned int *arr = malloc(sizeof(unsigned int)*len);
//sicherstellen dass zahlen einmalig vorkommen
srand(time(NULL));
for(int i = 0; i < len; i++){
while(1){
unsigned int value = (rand() % (2 * len)) + 1;
int alreadyUsed = 0;
for(int j = 0; j < i; j++) {
if(arr[j] == value) {
alreadyUsed = 1;
break;
}
}
if(!alreadyUsed) {
arr[i] = value;
break;
}
}
}
//eine zahl duplizieren und irgendwo hinkopieren
int dupIndex = rand() % len;
int targetIndex;
do{
targetIndex = rand() % len;
}while (targetIndex == dupIndex);
arr[targetIndex] = arr[dupIndex];
return arr;
} }
// Returns only the only number in numbers which is present twice. Returns zero on errors. // 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 getDuplicate(const unsigned int numbers[], unsigned int len)
{ {
if(len < 2){
return 0;
}
unsigned int *copy = malloc(sizeof(unsigned int)*len);
memcpy(copy, numbers, len * sizeof(unsigned int));
qsort(copy, len, sizeof(unsigned int), compare);
unsigned int duplicate = 0;
for(int i = 1; i < len; i++){
if(copy[i] == copy[i-1]){
duplicate = copy[i];
break;
}
}
free(copy);
return duplicate;
} }

View File

@ -1,61 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "numbers.h"
//Funktion, um nachzuprüfen, ob Test bestanden wurde
void check(char *msg, int expected, int actual){
printf("%s: ", msg);
printf("Erwartet: %d, Tatsächlich: %d\n", expected, actual);
if(expected == actual){
printf("Test bestanden\n");
}else{
printf("Test nicht bestanden\n");
}
}
int main(){
//prüfen, ob len < 2 NULL zurückgibt
unsigned int *numbers = createNumbers(1);
check("createNumbers mit len < 2", 1, numbers == NULL);
if(numbers != NULL){
free(numbers);
}
//prüfen, ob len = 10 ein Array zurückgibt
int len = 10;
numbers = createNumbers(len);
check("createNumbers mit len = 10", 1, numbers != NULL);
//prüfen, ob alle Zahlen zwischen 1 und 2*len liegen
int OK = 1;
for(int i = 0; i < len; i++){
if(numbers[i] < 1 || numbers[i] > 2*len){
OK = 0;
break;
}
}
check("Zahlenbereich bei createNumbers", 1, OK);
//prüfen, ob genau eine Zahl doppelt vorkommt
int duplikat = 0;
for(int i = 0; i < len; i++){
for(int j = i+1; j < len; j++){
if(numbers[i] == numbers[j]){
duplikat++;
}
}
}
check("Genau ein Duplikat bei createNumbers", 1, duplikat == 1);
free(numbers);
//Tests getDuplicate
int testArray1[] = {1,2,3,4,5,5,6,7,8,9};
int result = getDuplicate(testArray1, 10);
check("getDuplicate Test 1", 5, result);
int testArray2[] = {10,20,30,40,50,60,70,80,90,90};
result = getDuplicate(testArray2, 10);
check("getDuplicate Test 2", 90, result);
//prüfen bei ungültiger länge
result = getDuplicate(testArray2, 1);
check("getDuplicate mit len < 2", 0, result);
return 0;
}

34
stack.c
View File

@ -8,52 +8,26 @@
* `clearStack`: gibt den gesamten Speicher frei. */ * `clearStack`: gibt den gesamten Speicher frei. */
// Pushes data as pointer onto the stack. // Pushes data as pointer onto the stack.
StackNode *push(StackNode *stack, void *data) StackNode *push(StackNode *stack, void *data)
{ {
//Neue Node wird erstellt, Speicher wird zugewiesen
StackNode *newNode = (StackNode *)malloc(sizeof(StackNode));
if (newNode == NULL) {
return NULL;
}
//Data und der zeiger auf den nächsten Node werden zugewiesen
newNode->data = data;
newNode->next = stack;
return newNode;
} }
// Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be
// freed by caller.) // freed by caller.)
StackNode *pop(StackNode *stack) StackNode *pop(StackNode *stack)
{ {
//Wenn Stack leer, wird NULL zurückgegeben
if(stack == NULL) {
return NULL;
}
//Nächster Node wird gespeichert, aktuellerr Node wird freigegeben
StackNode *next = stack->next;
free(stack);
return next;
} }
// Returns the data of the top element. // Returns the data of the top element.
void *top(StackNode *stack) void *top(StackNode *stack)
{ {
if(stack == NULL) {
return NULL;
}
return stack->data;
} }
// Clears stack and releases all memory. // Clears stack and releases all memory.
void clearStack(StackNode *stack) void clearStack(StackNode *stack)
{ {
//Speichert den aktuellen Node, freed ihn dann und geht zum nächsten
StackNode *temp;
while(stack != NULL) {
temp = stack;
stack = stack->next;
free(temp);
}
} }

View File

@ -8,12 +8,7 @@ The latest element is taken from the stack. */
#include <stdlib.h> #include <stdlib.h>
//TODO: passenden Datentyp als struct anlegen //TODO: passenden Datentyp als struct anlegen
typedef struct{
void *data;
struct StackNode *next;
}StackNode;
// Pushes data as pointer onto the stack. // Pushes data as pointer onto the stack.
StackNode *push(StackNode *stack, void *data); StackNode *push(StackNode *stack, void *data);

View File

@ -1,58 +0,0 @@
#include <stdio.h>
#include "stack.h"
#include <stdlib.h>
//Funktion, um nachzuprüfen, ob Test bestanden wurde
void check(char *msg, int expected, int actual){
printf("%s: ", msg);
printf("Erwartet: %d, Tatsächlich: %d\n", expected, actual);
if(expected == actual){
printf("Test bestanden\n");
}else{
printf("Test nicht bestanden\n");
}
}
//Schnappt sich oberstes Element
int getTop(StackNode *stack){
void *data = top(stack);
return(int)data;
}
//Tests der einzelnen Stackfunktionen
int main(){
StackNode *stack = NULL;
//Test push
stack = push(stack, (void*)10);
check("Nach Push 10", 10, getTop(stack));
stack = push(stack, (void*)20);
check("Nach Push 20", 20, getTop(stack));
//pop testen
stack = pop(stack);
check("Nach Pop", 10, getTop(stack));
//clearStack testen
clearStack(stack);
stack = NULL;
check("Nach ClearStack", 0, getTop(stack));
return 0;
}