From ac55496d881e0a17b3eff85f1faae5aafbc53b50 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 22 Jul 2020 17:30:45 +0200 Subject: erster Commit --- stack.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 stack.c (limited to 'stack.c') diff --git a/stack.c b/stack.c new file mode 100644 index 0000000..fa89974 --- /dev/null +++ b/stack.c @@ -0,0 +1,98 @@ +/* Standard C */ +#include +#include +#include + +/* Project */ +#include "util.h" + +typedef int T; + +struct stack_item { + struct stack_item *next; + T data; +}; + +struct stack { + struct stack_item *head; +}; + +void +stack_init(struct stack *stack) +{ + stack->head = NULL; +} + +void +stack_push(struct stack *stack, T data) +{ + struct stack_item *new_item; + + if ( (new_item = malloc(sizeof(*new_item))) != NULL ) { + new_item->data = data; + new_item->next = stack->head; + stack->head = new_item; + } + else + ERROR("out of memory"); +} + +bool +stack_pop(struct stack *stack, T *data) +{ + if ( stack->head != NULL ) { + struct stack_item *next = stack->head->next; + *data = stack->head->data; + free(stack->head); + stack->head = next; + + return true; + } + else + return false; +} + +bool +stack_empty(struct stack *stack) +{ + return stack->head == NULL; +} + +void +stack_free(struct stack *stack) +{ + struct stack_item *item, *next; + + for ( item = stack->head; item; item = next ) { + next = item->next; + free(item); + } +} + +int +main() +{ + struct stack stack[1]; + + stack_init(stack); + + for ( int i = 0; i != 10; ++i ) + stack_push(stack, i); + + /* + while ( !stack_empty(stack) ) { + int i; + if ( stack_pop(stack, &i) ) + printf("%d\n", i); + else + ERROR("this shouldn't happen!"); + } + */ + + stack_free(stack); + + return EXIT_SUCCESS; +} + + + -- cgit v1.3