diff --git a/stack.c b/stack.c index e3a90d4..c13df34 100644 --- a/stack.c +++ b/stack.c @@ -1,33 +1,43 @@ #include #include "stack.h" -//TODO: grundlegende Stackfunktionen implementieren: -/* * `push`: legt ein Element oben auf den Stack, - * `pop`: entfernt das oberste Element, - * `top`: liefert das oberste Element zurück, - * `clearStack`: gibt den gesamten Speicher frei. */ +typedef struct Stack_node { + void *data; + struct Stack_node *next; +} StackNode; -// Pushes data as pointer onto the stack. -StackNode *push(StackNode *stack, void *data) -{ +// Pushes data onto the stack. +// Returns the new top of the stack. +StackNode *push(StackNode *stack, void *data) { + StackNode *node = malloc(sizeof(StackNode)); + if (!node) return stack; // allocation failed → leave unchanged + node->data = data; + node->next = stack; + return node; // new top element } -// 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) -{ +// Deletes the top element and returns the new stack top. +// Caller must free the *data* itself. +StackNode *pop(StackNode *stack) { + if (!stack) return NULL; + StackNode *next = stack->next; + free(stack); // free only the node, NOT the data + return next; } -// Returns the data of the top element. -void *top(StackNode *stack) -{ - +// Returns the data at the top of the stack. +void *top(StackNode *stack) { + if (!stack) return NULL; + return stack->data; } -// Clears stack and releases all memory. -void clearStack(StackNode *stack) -{ - -} \ No newline at end of file +// Clears entire stack (but does NOT free the data). +void clearStack(StackNode *stack) { + while (stack) { + StackNode *next = stack->next; + free(stack); + stack = next; + } +}