fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct node {
  5. int val;
  6. struct node *next;
  7. } Node;
  8.  
  9. Node *head = NULL;
  10.  
  11. Node* createN(int x) {
  12. Node *newnode;
  13. newnode = (Node *)malloc(sizeof(Node));
  14. newnode->val = x;
  15. newnode->next = NULL;
  16. return newnode;
  17. }
  18.  
  19. void freeL() {
  20. Node *p;
  21. while (head != NULL) {
  22. p = head->next;
  23. free(head);
  24. head = p;
  25. }
  26. }
  27.  
  28. void insHead(int x) {
  29. Node *p = createN(x);
  30. p->next = head;
  31. head = p;
  32. }
  33.  
  34. void insTail(int x) {
  35. Node *p = head;
  36. if (p == NULL) {
  37. head = createN(x);
  38. return;
  39. }
  40. while (p->next != NULL) {
  41. p = p->next;
  42. }
  43. p->next = createN(x);
  44. }
  45.  
  46. void delHead() {
  47. if (head == NULL) return; // リストが空の場合は何もしない
  48. Node *p = head;
  49. head = head->next;
  50. free(p);
  51. }
  52.  
  53. void delTail() {
  54. if (head == NULL) return; // リストが空の場合
  55. if (head->next == NULL) { // リストが1つだけの場合
  56. free(head);
  57. head = NULL;
  58. return;
  59. }
  60. Node *p = head;
  61. while (p->next->next != NULL) {
  62. p = p->next;
  63. }
  64. free(p->next);
  65. p->next = NULL;
  66. }
  67.  
  68. void push(int x) {
  69. insHead(x); // スタックの push: 先頭に挿入
  70. }
  71.  
  72. int pop() {
  73. if (head == NULL) {
  74. printf("Stack underflow\n");
  75. return -1; // スタックが空の場合
  76. }
  77. int value = head->val;
  78. delHead();
  79. return value;
  80. }
  81.  
  82. void enqueue(int x) {
  83. insTail(x); // キューの enqueue: 末尾に挿入
  84. }
  85.  
  86. int dequeue() {
  87. if (head == NULL) {
  88. printf("Queue underflow\n");
  89. return -1; // キューが空の場合
  90. }
  91. int value = head->val;
  92. delHead();
  93. return value;
  94. }
  95.  
  96. int main(void) {
  97. int s1, s2, s3, q1, q2, q3;
  98.  
  99. // スタック操作
  100. push(1);
  101. push(2);
  102. push(3);
  103. s1 = pop();
  104. s2 = pop();
  105. s3 = pop();
  106. printf("%d %d %d\n", s1, s2, s3);
  107.  
  108. // キュー操作
  109. enqueue(1);
  110. enqueue(2);
  111. enqueue(3);
  112. q1 = dequeue();
  113. q2 = dequeue();
  114. q3 = dequeue();
  115. printf("%d %d %d\n", q1, q2, q3);
  116.  
  117.  
  118. freeL();
  119. return 0;
  120. }
  121.  
Success #stdin #stdout 0s 5288KB
stdin
1 2 3
1 2 3
stdout
3 2 1
1 2 3