Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

linkstack.c 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "linkstack.h"
  4. linkstack_t pkt_creat_linkstack(void)
  5. {
  6. linkstack_t s ;
  7. if ((s = (linkstack_t)malloc(sizeof(struct linkstack))) == NULL)
  8. {
  9. printf("malloc failed!\n");
  10. return NULL;
  11. }
  12. s->next = NULL;
  13. return s;
  14. }
  15. int pkt_empty_linkstack(linkstack_t s)
  16. {
  17. return s->next == NULL;
  18. }
  19. stack_frame_t pkt_get_linkstack_top(linkstack_t s)
  20. {
  21. if (pkt_empty_linkstack(s))
  22. {
  23. printf("linkstack is empty!\n");
  24. return NULL;
  25. }
  26. return &s->next->frame;
  27. }
  28. int pkt_linkstack_push(linkstack_t s, stack_frame_t frame)
  29. {
  30. PKT_ASSERT(s);
  31. PKT_ASSERT(frame);
  32. linkstack_t f;
  33. if ((f = (linkstack_t)malloc(sizeof(struct linkstack))) == NULL)
  34. {
  35. printf("malloc failed!\n");
  36. return -1;
  37. }
  38. f->frame = *frame;
  39. f->next = s->next;
  40. s->next = f;
  41. return 0;
  42. }
  43. struct stack_frame pkt_linkstack_pop(linkstack_t s)
  44. {
  45. struct stack_frame f = {0};
  46. if (pkt_empty_linkstack(s))
  47. {
  48. printf("linkstack is empty!\n");
  49. return f;
  50. }
  51. linkstack_t d = s->next;
  52. s->next = d->next;
  53. f = d->frame;
  54. free(d);
  55. return f;
  56. }
  57. int pkt_clear_linkstack(linkstack_t s)
  58. {
  59. linkstack_t d = s->next;
  60. while (d)
  61. {
  62. s->next = d->next;
  63. free(d);
  64. d = s->next;
  65. }
  66. return 0;
  67. }
  68. int pkt_free_linkstack(linkstack_t s) /* include free head */
  69. {
  70. linkstack_t d = s;
  71. while (d)
  72. {
  73. s = d->next;
  74. free(d);
  75. d = s;
  76. }
  77. return 0;
  78. }
  79. int main(void)
  80. {
  81. linkstack_t s = pkt_creat_linkstack();
  82. struct stack_frame frame;
  83. for (int i = 0; i < 10; i++)
  84. {
  85. frame.data = i;
  86. pkt_linkstack_push(s, &frame);
  87. }
  88. while (!pkt_empty_linkstack(s))
  89. {
  90. printf("%d\n", pkt_linkstack_pop(s).data);
  91. }
  92. pkt_free_linkstack(s);
  93. return 0;
  94. }