diff --git a/stack.c b/stack.c index e3a90d4..ea5d804 100644 --- a/stack.c +++ b/stack.c @@ -10,24 +10,54 @@ // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data) { + // Neues Stack-Element erstellen + StackNode *newNode = malloc(sizeof(StackNode)); + if (!newNode) { + return stack; // oder NULL, je nach Fehlerstrategie + } + + newNode->data = data; + newNode->next = stack; // bisheriger Stack wird nach unten geschoben + + return newNode; // neuer Kopf des Stacks } // 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) { + if (stack == NULL) + return NULL; + StackNode *newTop = stack->next; + + // Daten gehen verloren! + // Caller KANN sie nicht freigeben. + free(stack); + + return newTop; } // Returns the data of the top element. void *top(StackNode *stack) { + if (stack == NULL) + return NULL; // kein Element im Stack + return stack->data; } // Clears stack and releases all memory. void clearStack(StackNode *stack) { + StackNode *current = stack; + + while (current != NULL) + { + StackNode *next = current->next; + free(current); + current = next; + } } \ No newline at end of file diff --git a/stack.h b/stack.h index f7d542d..2506346 100644 --- a/stack.h +++ b/stack.h @@ -8,6 +8,10 @@ The latest element is taken from the stack. */ #include //TODO: passenden Datentyp als struct anlegen +typedef struct Node { + void *data; + struct Node *next; +} StackNode; // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data);