fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct List List;
  5. typedef struct Node Node;
  6.  
  7. struct List {
  8. int size;
  9. Node* head;
  10. };
  11.  
  12. struct Node {
  13. int value;
  14. Node* next;
  15. Node* prev;
  16. };
  17.  
  18. List* newList() {
  19. List* list = malloc(sizeof(List));
  20.  
  21. if (list == NULL) {
  22. return NULL;
  23. }
  24.  
  25. list->size = 0;
  26. list->head = NULL;
  27.  
  28. return list;
  29. }
  30.  
  31. void insertAsHead(List* list, int v) {
  32. if (list == NULL) {
  33. return;
  34. }
  35.  
  36. Node* node = malloc(sizeof(Node));
  37.  
  38. if (node == NULL) {
  39. return;
  40. }
  41.  
  42. node->value = v;
  43.  
  44. if (list->head == NULL) {
  45. list->head = node;
  46. node->next = node;
  47. node->prev = node;
  48. } else {
  49. Node* head = list->head;
  50. Node* tail = head->prev;
  51.  
  52. node->next = head;
  53. node->prev = tail;
  54.  
  55. head->prev = node;
  56. tail->next = node;
  57.  
  58. list->head = node;
  59. }
  60.  
  61. list->size++;
  62. }
  63.  
  64. char* containsValue(List* list, int v) {
  65. if (list == NULL) {
  66. return "no";
  67. }
  68.  
  69. Node* head = list->head;
  70.  
  71. if (head == NULL) {
  72. return "no";
  73. }
  74.  
  75. Node* tail = head->prev;
  76.  
  77. do {
  78. if (head->value == v) {
  79. return "yes";
  80. }
  81.  
  82. head = head->next;
  83. } while (head != tail->next);
  84.  
  85. return "no";
  86. }
  87.  
  88. void printListForward(List* list) {
  89. if (list == NULL) {
  90. return;
  91. }
  92.  
  93. Node* head = list->head;
  94.  
  95. if (head != NULL) {
  96. printf("List { %d ", head->value);
  97.  
  98. Node* tail = head->prev;
  99.  
  100. while (head != tail) {
  101. head = head->next;
  102. printf("-> %d ", head->value);
  103. }
  104.  
  105. puts("}");
  106. } else {
  107. puts("List { }");
  108. }
  109. }
  110.  
  111. int main() {
  112. List* list = newList();
  113.  
  114. insertAsHead(list, 5);
  115. insertAsHead(list, 6);
  116. insertAsHead(list, 7);
  117.  
  118. printListForward(list);
  119.  
  120. puts(containsValue(list, 5));
  121. puts(containsValue(list, 6));
  122. puts(containsValue(list, 7));
  123. puts(containsValue(list, 8));
  124.  
  125. printListForward(list);
  126.  
  127. insertAsHead(list, 8);
  128.  
  129. printListForward(list);
  130.  
  131. puts(containsValue(list, 5));
  132. puts(containsValue(list, 6));
  133. puts(containsValue(list, 7));
  134. puts(containsValue(list, 8));
  135.  
  136. printListForward(list);
  137.  
  138. return 0;
  139. }
Success #stdin #stdout 0s 2244KB
stdin
Standard input is empty
stdout
List { 7 -> 6 -> 5 }
yes
yes
yes
no
List { 7 -> 6 -> 5 }
List { 8 -> 7 -> 6 -> 5 }
yes
yes
yes
yes
List { 8 -> 7 -> 6 -> 5 }