#include "stack.h" #include #include /*typedef struct { void *data; struct StackNode *next; } 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 // head -> stack.next StackNode *createNode(void *data) { StackNode *node = malloc(sizeof(StackNode)); 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); if (newNode == NULL) { return stack; } newNode->next = stack; if (stack != NULL) { stack->prev = newNode; } 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 == NULL) return NULL; StackNode *nextNode = stack->next; if (nextNode != NULL) { nextNode->prev = NULL; } free(stack); stack = NULL; return nextNode; } // Returns the data of the top element. void *top(StackNode *stack) { return stack ? stack->data : NULL; } // Clears stack and releases all memory. void clearStack(StackNode **stack) { while (*stack != NULL) { StackNode *next = (*stack)->next; free(*stack); *stack = next; } }