#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. // Hilfsfunktion: Erstellt nur den "Container" (die Node) static StackNode *createStackNode(void *data) { // 1. Container reservieren StackNode *newNode = calloc(1, sizeof(StackNode)); if(!newNode) return NULL; // 2. WICHTIG: Wir speichern nur den Zeiger (die Adresse)! // Wir machen KEIN zweites malloc für die Daten. // Der Stack "besitzt" die Daten nicht, er referenziert sie nur. newNode->data = data; newNode->nextNode = NULL; return newNode; } StackNode *push(StackNode *stack, void *data) { // Neue Node erstellen StackNode *newNode = createStackNode(data); if (!newNode) { return stack; // Fehlerfall: Stack bleibt unverändert (oder Fehlerbehandlung) } // Verkettung: Die neue Node zeigt auf den alten Kopf newNode->nextNode = stack; // Die neue Node ist der neue Kopf (Rückgabewert) 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) { if(stack) { StackNode* tempNode = stack -> nextNode; free(stack); return tempNode; } return stack; } // Returns the data of the top element. void *top(StackNode *stack) { if(stack) { return stack ->data; } return NULL; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { StackNode *temp = NULL; while(stack) { temp = stack -> nextNode; free(stack); stack = temp; } }