inf2Projekt_3/stack.c

88 lines
2.6 KiB
C

// Funktionen für stack.c erstellt von Harun Faizi am 05.12.25
#include <stdlib.h>
#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 den Pointer den Fkt. bekommen hat in Datenfeld/Strukturfeld --> void *data
newNode->data = data;
// Verbindet neuen Knoten mit bisherigen Stack, newNode zeigt jetzt auf das bisherige Top
newNode->next = stack;
return newNode;
}
// (Pointer to data has to be
// freed by caller.) --> data selber löschen
// pop löscht 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->next; // 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->next; // nächster Knoten wird ausgewählt
free(stack); // Top wird gelöscht
stack = next; // nächster Knoten ist stack (Top)
}
}