Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * stack.c
- */
- #include "stack.h"
- sPtr SCreate(CompareFuncT cf){
- sPtr s = malloc(sizeof(struct Stack));
- s->top = NULL;
- s->bottom = NULL;
- s->cf = cf;
- s->size = 0;
- return s;
- }
- void SDestroy(sPtr s){
- if (s->size == 0){
- free(s);
- return;
- }
- while (s->size != 0)
- SPop(s);
- free(s);
- return;
- }
- int SPush(sPtr s, void *data){
- if (data == NULL)
- return 1;
- sNode *new = malloc(sizeof(sNode));
- new->data = data;
- new->next = NULL;
- new->rc = 0;
- if (s->size == 0){
- s->top = new;
- s->bottom = new;
- s->size++;
- return 0;
- }
- new->next = s->top;
- s->top = new;
- s->size++;
- return 0;
- }
- void *SPop(sPtr s){
- if (s->size == 0)
- return NULL;
- sNode *pop = s->top;
- if (pop->rc > 0)
- return NULL;
- void *data = pop->data;
- s->top = pop->next;
- free(pop);
- return data;
- }
- int SDelete(sPtr s, void *data){
- if (s->size == 0)
- return 1;
- sNode *i = s->top;
- int cr = s->cf(data, i->data);
- if (cr == 0){
- sNode *delete = i;
- i = i->next;
- s->top = i;
- free(delete);
- s->size--;
- return 0;
- }
- while (i->next != NULL){
- sNode *next = i->next;
- cr = s->cf(data, next->data);
- if (cr == 0){
- if (next->rc > 0)
- return 2;
- i->next = next->next;
- free(next);
- s->size--;
- return 0;
- }
- i = i->next;
- }
- return 1;
- }
- siPtr SCreateIterator(sPtr s){
- siPtr si = malloc(sizeof(struct StackIterator));
- si->ptr = s->top;
- si->ptr->rc++;
- return si;
- }
- void SDestroyIterator(siPtr si){
- if (si->ptr != NULL)
- si->ptr->rc--;
- free(si);
- }
- void *SAdvanceIterator(siPtr si){
- if (si->ptr == NULL)
- return NULL;
- void *data = si->ptr->data;
- si->ptr->rc--;
- si->ptr = si->ptr->next;
- if (si->ptr != NULL)
- si->ptr->rc++;
- return data;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement