diff --git a/stack.c b/stack.c index e3a90d4..5cef845 100644 --- a/stack.c +++ b/stack.c @@ -7,27 +7,47 @@ * `top`: liefert das oberste Element zurück, * `clearStack`: gibt den gesamten Speicher frei. */ -// Pushes data as pointer onto the stack. -StackNode *push(StackNode *stack, void *data) +// 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 } -// 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) +// 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; } -// Returns the data of the top element. -void *top(StackNode *stack) +// 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) } -// Clears stack and releases all memory. -void clearStack(StackNode *stack) +// 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 + } } \ No newline at end of file diff --git a/stack.h b/stack.h index f7d542d..5ecbceb 100644 --- a/stack.h +++ b/stack.h @@ -1,4 +1,4 @@ -#ifndef STACK_H +#ifndef STACK_H //if not defined - Code nur ausgeführt wenn nicht definiert #define STACK_H /* A stack is a special type of queue which uses the LIFO (last in, first out) principle. @@ -9,17 +9,22 @@ The latest element is taken from the stack. */ //TODO: passenden Datentyp als struct anlegen -// Pushes data as pointer onto the stack. +// Datentyp für Stack-Element +typedef struct StackNode { + void *data; // Zeiger auf Nutzdaten (Datentyp unbekannt) + struct StackNode *next; // Zeiger auf das nächste Element +} StackNode; + +// Pushes Daten als Zeiger auf den Stack. StackNode *push(StackNode *stack, void *data); -// Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be -// freed by caller.) +// Löscht das oberste Element des Stacks (letztes hinzugefügtes) und gibt den Speicher frei. StackNode *pop(StackNode *stack); -// Returns the data of the top element. +// Gibt den Wert des obersten Elements zurück. void *top(StackNode *stack); -// Clears stack and releases all memory. +// Leert den Stack und gibt den gesamten Speicher frei. void clearStack(StackNode *stack); #endif diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..e69de29