#include "stack.h" #include #include /*typedef struct { void *data; struct StackNode *next; struct StackNode *prev; } StackNode;*/ // 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. */ // [A] -> [B] -> [C] -> NULL // stack -> stack.next // Funktion zum erstellen neuer nodes StackNode *createNode(void *data) { // Speicher reservieren StackNode *node = malloc(sizeof(StackNode)); // Speicher konnte nicht reserviert werden if (node == NULL) return NULL; node->data = data; node->next = NULL; node->prev = NULL; return node; } // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data) { StackNode *newNode = createNode(data); // Fehler beim Reservieren des Speichers, stack wird unverändert zurückgegeben if (newNode == NULL) { return stack; } // der aktuelle Kopf wird der nächste Node newNode->next = stack; // bisheriger Kopf bekommt Pointer auf oberstes Element if (stack != NULL) { stack->prev = newNode; } return newNode; // neuer Kopf wird zurückgegeben } // 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) { // Stack ohne Elemente if (stack == NULL) return NULL; // Element unter Kopf wird als nextNode gespeichert StackNode *nextNode = stack->next; if (nextNode != NULL) { nextNode->prev = NULL; // der Zeiger zum Kopf wird auf NULL gesetzt } free(stack); stack = NULL; // Speicher des Kopfes freigeben return nextNode; // neuen Kopf zurückgeben } // Returns the data of the top element. void *top(StackNode *stack) { // wenn stack leer ist, wird NULL zurückgegeben // Zeiger auf Daten des obersten Elements return stack ? stack->data : NULL; } // Clears stack and releases all memory. void clearStack(StackNode **stack) { // Zeiger auf den Zeiger auf den Stackkopf // verändert den Zeiger selbst, mit *stack lokale Kopie // im Aufruf &stack verwenden while (*stack != NULL) { StackNode *next = (*stack)->next; // nächstes Element speichern free(*stack); // aktuelles Element freigeben *stack = next; // Zeiger auf nächsten Knoten setzen } }