// Funktionen für stack.c erstellt von Harun Faizi am 05.12.25 #include #include "stack.h" //Format der Knoten //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. */ // Push legt neues Element oben auf Stack // Paramter: // StackNode *stack --> aktuelles Top des Stacks (Zeiger auf obersten Knoten) // void *data --> Zeiger auf Element, das gespeichert werden soll (Pointer zum Wert) // Fkt. gibt einen Zeiger auf neue Top des Stacks zurück StackNode *push(StackNode *stack, void *data) { // Neuer Knoten im Heap im Format StackNode --> newNode ist ein Zeiger darauf StackNode *newNode = malloc(sizeof(StackNode)); // Speichert Datenzeiger im data-Feld newNode->data = data; // Verbindet neuen Knoten mit bisherigen Stack, newNode zeigt jetzt auf das bisherige Top newNode->nextNode = stack; return newNode; } // (Pointer to data has to be // freed by caller.) --> data selber löschen // pop entfernt das oberste Element // Parameter: // StackNode *stack --> das aktuelle Top // Fkt. gibt StackNode * zurück, das neue Top des Stacks StackNode *pop(StackNode *stack) { if (stack == NULL) { return NULL; //wenn Stack leer dann nichts tun } StackNode *next = stack->nextNode; // das nächste Element wird neues Top free(stack); // altes Top wird aus Speicher entfernt return next; // gibt neues Top zurück } // Soll den Daten-Zeiger zurückgeben, der an Top StackNode gespeichert ist // Parameter: // StackNode *stack --> das aktuelle Top // Fkt. gibt void * zurück --> einen Zeiger auf beliebigen Datentyp void *top(StackNode *stack) { if (stack == NULL){ return NULL; // wenn kein Top Knoten, wird nichts zurückgegeben } return stack->data; //Zeiger auf Daten des Top Knoten zuückgeben } // Fkt. löscht alle Knoten des Stacks aus Heap und gibt Speicher frei // Parameter: // StackNode *stack --> das aktuelle Top // nach Fkt. existiert Stack nicht mehr --> keine Rückgabe void clearStack(StackNode *stack) { while (stack != NULL) { // solange es Knoten gibt mach weiter, am Ende der liste -> NULL StackNode *next = stack->nextNode; // nächster Knoten wird ausgewählt free(stack); // Top wird gelöscht stack = next; // nächster Knoten ist stack (Top) } }