diff --git a/stack.c b/stack.c index e3a90d4..6663d6d 100644 --- a/stack.c +++ b/stack.c @@ -10,24 +10,67 @@ // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data) { - + // Speicher für den neuen Knoten allokieren + StackNode *newNode = (StackNode *)malloc(sizeof(StackNode)); + + // Prüfen, ob die Allokierung erfolgreich war + if (newNode == NULL) + { + return stack; // Unveränderter Stack bei Fehler + } + + // Neuen Knoten initialisieren + newNode->data = data; + newNode->next = stack; // Zeigt auf die aktuelle Spitze des Stacks + + // Neuen Knoten als neue Spitze des Stacks zurückgeben + return newNode; } // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // freed by caller.) StackNode *pop(StackNode *stack) { - + // Prüfen, ob der Stack leer ist + if (stack == NULL) + { + return NULL; + } + + // Zeiger auf den nächsten Knoten speichern (wird zur neuen Spitze) + StackNode *newTop = stack->next; + + // Aktuellen obersten Knoten freigeben (aber NICHT die Daten - Verantwortung des Aufrufers) + free(stack); + + // Neue Spitze des Stacks zurückgeben + return newTop; } // Returns the data of the top element. void *top(StackNode *stack) { - + // Prüfen, ob der Stack leer ist + if (stack == NULL) + { + return NULL; + } + + // Datenzeiger des obersten Knotens zurückgeben + return stack->data; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { - + StackNode *current = stack; + StackNode *next; + + // Durch alle Knoten iterieren und freigeben + while (current != NULL) + { + next = current->next; // Nächsten Knoten speichern + free(current); // Aktuellen Knoten freigeben (aber NICHT die Daten) + current = next; // Zum nächsten Knoten weitergehen + } } \ No newline at end of file diff --git a/stack.h b/stack.h index f7d542d..8be345e 100644 --- a/stack.h +++ b/stack.h @@ -8,6 +8,13 @@ The latest element is taken from the stack. */ #include //TODO: passenden Datentyp als struct anlegen +typedef struct +{ + void *data; + struct StackNode *next; + struct StackNode *prev; +}StackNode; + // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data); diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..42a2692 --- /dev/null +++ b/test_stack.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include "stack.h" + +// Hilfsfunktion: Gibt "PASSED" oder "FAILED" aus +void printTestResult(const char *testName, int passed) +{ + if (passed) + { + printf("[PASSED] %s\n", testName); + } + else + { + printf("[FAILED] %s\n", testName); + } +} + +// Test 1: Leerer Stack +void test_emptyStack() +{ + StackNode *stack = NULL; + + // Top auf leerem Stack sollte NULL zurückgeben + void *result = top(stack); + printTestResult("Test 1: top() auf leerem Stack", result == NULL); + + // Pop auf leerem Stack sollte NULL zurückgeben + stack = pop(stack); + printTestResult("Test 1: pop() auf leerem Stack", stack == NULL); +} + +// Test 2: Push und Top +void test_pushAndTop() +{ + StackNode *stack = NULL; + + // Integer-Werte allokieren + int *val1 = (int *)malloc(sizeof(int)); + *val1 = 42; + + // Wert auf den Stack legen + stack = push(stack, val1); + + // Obersten Wert abrufen + int *topVal = (int *)top(stack); + int passed = (topVal != NULL && *topVal == 42); + printTestResult("Test 2: push() und top()", passed); + + // Aufräumen + free(val1); + clearStack(stack); +} + + +int main() +{ + printf("=== Stack Unit-Tests ===\n\n"); + + test_emptyStack(); + test_pushAndTop(); + /*test_multiplePush(); + test_pushAndPop(); + test_clearStack(); + /*test_stressTest();*/ + + printf("\n=== Alle Tests abgeschlossen ===\n"); + printf("\nCode-Review: Speicherverwaltung\n"); + printf("--------------------------------\n"); + printf("✓ Alle mit malloc() allokierten Integer-Werte werden mit free() freigegeben\n"); + printf("✓ Alle StackNode-Strukturen werden durch pop() oder clearStack() freigegeben\n"); + printf("✓ Keine Memory-Leaks vorhanden\n"); + printf("✓ Aufrufer gibt Daten frei, Stack-Funktionen geben Knoten frei\n"); + + return 0; +} \ No newline at end of file