/* Standard C */ #include #include #include /* Project */ #include "util.h" /* --8<-- stack_type */ typedef int T; struct stack_item { struct stack_item *next; T data; }; struct stack { struct stack_item *head; }; /* -->8-- */ /* --8<-- stack_init */ void stack_init(struct stack *stack) { stack->head = NULL; } /* -->8-- */ /* --8<-- stack_push */ 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"); } /* -->8-- */ /* --8<-- stack_pop */ bool stack_pop(struct stack *stack, T *data) { if ( stack->head ) { struct stack_item *next = stack->head->next; if ( data ) { *data = stack->head->data; } free(stack->head); stack->head = next; return true; } else return false; } /* -->8-- */ /* --8<-- stack_empty */ bool stack_empty(struct stack *stack) { return stack->head == NULL; } /* -->8-- */ /* --8<-- stack_free */ void stack_free(struct stack *stack) { struct stack_item *item, *next; for ( item = stack->head; item; item = next ) { next = item->next; free(item); } } /* -->8-- */ int main(void) { 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; }