generated from freudenreichan/info2Praktikum-DobleSpiel
88 lines
2.6 KiB
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)
|
|
}
|
|
} |