Advertisement
Guest User

Untitled

a guest
Apr 12th, 2013
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. /*
  2. * stack.c
  3. */
  4. #include "stack.h"
  5. sPtr SCreate(CompareFuncT cf){
  6. sPtr s = malloc(sizeof(struct Stack));
  7. s->top = NULL;
  8. s->bottom = NULL;
  9. s->cf = cf;
  10. s->size = 0;
  11. return s;
  12. }
  13. void SDestroy(sPtr s){
  14. if (s->size == 0){
  15. free(s);
  16. return;
  17. }
  18. while (s->size != 0)
  19. SPop(s);
  20. free(s);
  21. return;
  22. }
  23. int SPush(sPtr s, void *data){
  24. if (data == NULL)
  25. return 1;
  26. sNode *new = malloc(sizeof(sNode));
  27. new->data = data;
  28. new->next = NULL;
  29. new->rc = 0;
  30. if (s->size == 0){
  31. s->top = new;
  32. s->bottom = new;
  33. s->size++;
  34. return 0;
  35. }
  36. new->next = s->top;
  37. s->top = new;
  38. s->size++;
  39. return 0;
  40. }
  41. void *SPop(sPtr s){
  42. if (s->size == 0)
  43. return NULL;
  44. sNode *pop = s->top;
  45. if (pop->rc > 0)
  46. return NULL;
  47. void *data = pop->data;
  48. s->top = pop->next;
  49. free(pop);
  50. return data;
  51. }
  52. int SDelete(sPtr s, void *data){
  53. if (s->size == 0)
  54. return 1;
  55. sNode *i = s->top;
  56. int cr = s->cf(data, i->data);
  57. if (cr == 0){
  58. sNode *delete = i;
  59. i = i->next;
  60. s->top = i;
  61. free(delete);
  62. s->size--;
  63. return 0;
  64. }
  65. while (i->next != NULL){
  66. sNode *next = i->next;
  67. cr = s->cf(data, next->data);
  68. if (cr == 0){
  69. if (next->rc > 0)
  70. return 2;
  71. i->next = next->next;
  72. free(next);
  73. s->size--;
  74. return 0;
  75. }
  76. i = i->next;
  77. }
  78. return 1;
  79. }
  80. siPtr SCreateIterator(sPtr s){
  81. siPtr si = malloc(sizeof(struct StackIterator));
  82. si->ptr = s->top;
  83. si->ptr->rc++;
  84. return si;
  85. }
  86. void SDestroyIterator(siPtr si){
  87. if (si->ptr != NULL)
  88. si->ptr->rc--;
  89. free(si);
  90. }
  91. void *SAdvanceIterator(siPtr si){
  92. if (si->ptr == NULL)
  93. return NULL;
  94. void *data = si->ptr->data;
  95. si->ptr->rc--;
  96. si->ptr = si->ptr->next;
  97. if (si->ptr != NULL)
  98. si->ptr->rc++;
  99. return data;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement