#include #include "rubiks.h" t_stack *stack_create() { t_stack *result = (t_stack *)malloc(sizeof(*result)); result->items = NULL; result->count = 0; return result; } t_stack *stack_copy(const t_stack *t) { t_stack *result = (t_stack *)malloc(sizeof(*result)); struct s_stackitem *aitem, *bitem; size_t i; result->items = NULL; result->count = t->count; if (result->count) { aitem = malloc(sizeof(*aitem)); bitem = t->items; aitem->value = bitem->value; result->items = aitem; for (i =1; i < t->count; ++i) { aitem->prev = malloc(sizeof(*aitem)); aitem = aitem->prev; bitem = bitem->prev; aitem->prev = NULL; aitem->value = bitem->value; } } return result; } int stack_pop(t_stack *s) { int r; struct s_stackitem *oldNode = s->items; if (!s->count) return -1; oldNode = s->items; r = oldNode->value; s->items = oldNode->prev; s->count--; free(oldNode); return r; } size_t stack_length(const t_stack *s) { return s->count; } int stack_value(const t_stack *s) { if (!s->count) return -1; return s->items->value; } void stack_destroy(t_stack *stack) { if (!stack) return; while (stack->count) stack_pop(stack); free(stack); } void stack_push(t_stack *st, int v) { struct s_stackitem *s = (struct s_stackitem *) malloc(sizeof(*s)); s->prev = st->count ? st->items : NULL; s->value = v; st->items = s; st->count++; }