| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include <stdlib.h>
- #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++;
- }
|