stack und teststack nicht final

This commit is contained in:
Manuel Nitsche 2025-12-09 14:22:29 +01:00
parent c325131503
commit 95af97bef7
3 changed files with 130 additions and 4 deletions

51
stack.c
View File

@ -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
}
}

View File

@ -8,6 +8,13 @@ The latest element is taken from the stack. */
#include <stdlib.h>
//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);

76
test_stack.c Normal file
View File

@ -0,0 +1,76 @@
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#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;
}