#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. */ // 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 } }