#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 Daten als Zeiger auf den Stack. StackNode *push(StackNode *stack, void *data) //*stack zeigt auf oberstes Element des Stacks, *data auf beliebige Daten { StackNode *newNode = malloc(sizeof(StackNode)); //Reserviert Speicher für neues Element (newNode zeigt auf Speicher) if (newNode == NULL) //falls Speicherreservierung fehlgeschlagen (Zeiger zeigt auf nichts) return stack; //unveränderter Stack newNode->data = data; //Übergeber Wert wird gespeichert newNode->next = stack; //Neues Element Top des Stacks return newNode; //Zurückgeben des neuen Elements } // Löscht das oberste Element des Stacks (letztes hinzugefügtes) und gibt den Speicher frei. StackNode *pop(StackNode *stack) { if (stack == NULL) //Falls Stack bereits leer (keine Änderung) return NULL; StackNode *next = stack->next; //Speichert das nächste Element free(stack); // Löschen des oberen Stack-Knoten (Inhalt extra freigeben) return next; } // Gibt den Wert des obersten Elements zurück. void *top(StackNode *stack) //aktueller Stackkopf als Parameter (gibt void zurück) { if (stack == NULL) //Falls Stack bereits leer (keine Änderung) return NULL; return stack->data; //Gibt Daten des oberen Stackknoten zurück (keine Änderung) } // Leert den Stack und gibt den gesamten Speicher frei. void clearStack(StackNode *stack) // gibt nichts zurück { while (stack != NULL) // solang Elemente im Stack { StackNode *next = stack->next; //Speichert nächstes Element free(stack); //Gibt den Speicher des Knotens frei (Daten nicht) stack = next; // Wechsel zum nächsten Knoten } }