fork download
  1. //Стек, реализованный с помощью структуры "Узел", которая хранит значение
  2. //(в нашем примере типа int) и указатель на следующий узел.
  3. //Это неэффективная реализация, которая требует удаления и выделения
  4. //памяти под узел при каждом вызове операции push и pop.
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <conio.h>
  8.  
  9. #define STACK_OVERFLOW 3
  10. #define STACK_UNDERFLOW 4
  11.  
  12. /**
  13. Узел ссылается на предыдущий элемент стека.
  14. Если узел ссылается на NULL, то это последний элемент стека
  15. */
  16. typedef struct Node {
  17. int value;
  18. struct Node *next;
  19. } Node;
  20.  
  21. /**
  22. Создаём новый узел и делаем его вершиной стека.
  23. */
  24. void push(Node *head, int val) {
  25. Node *tmp = NULL;
  26. if (!(tmp = (Node*) malloc(sizeof(Node)))) {
  27. exit(STACK_OVERFLOW);
  28. }
  29. tmp->next = head->next;
  30. tmp->value = head->value;
  31. head->value = val;
  32. head->next = tmp;
  33. }
  34.  
  35. /**
  36. Возвращаем значение текущей вершиныи удаляем её
  37. */
  38. int pop(Node **head) {
  39. Node *tmp = (*head)->next;
  40. int val = (*head)->value;
  41. if ((*head)->next == NULL) {
  42. exit(STACK_UNDERFLOW);
  43. }
  44. free(*head);
  45. (*head) = tmp;
  46. return val;
  47. }
  48.  
  49. /**
  50. Удаляем все вершины
  51. */
  52. void freeList(struct Node **head) {
  53. Node *tmp = NULL;
  54. while ((*head)->next) {
  55. tmp = (*head)->next;
  56. free(*head);
  57. (*head) = tmp;
  58. }
  59. }
  60.  
  61. /**
  62. Для того, чтобы получить последний элемент, необходимо
  63. по цепочке пройти до него
  64. */
  65. Node* getLast(struct Node *head) {
  66. Node* tmp;
  67. tmp = head -> next;
  68. while (tmp) {
  69. tmp = tmp -> next;
  70. }
  71. return tmp;
  72. }
  73.  
  74. void main(){
  75. Node *head = NULL;
  76. int i;
  77.  
  78. head = (Node*)malloc(sizeof(Node));
  79. head -> next = NULL;
  80.  
  81. push(head, 100);
  82. push(head, 300);
  83. printf("%d\n", pop(&head));
  84. push(head, 200);
  85. push(head, 1000);
  86.  
  87. while (head->next) {
  88. printf("%d\n", pop(&head));
  89. }
  90.  
  91. free(head);
  92. getch();
  93. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c:7:19: fatal error: conio.h: No such file or directory
 #include <conio.h>
                   ^
compilation terminated.
stdout
Standard output is empty