fork download
  1. // Struct thể hiện một node trên danh sách liên kết.
  2. struct Node
  3. {
  4. int value;
  5. struct Node* next;
  6. struct Node* prev;
  7.  
  8. Node()
  9. {
  10. value = 0;
  11. next = NULL;
  12. prev = NULL;
  13. }
  14.  
  15. void create_node(int _value)
  16. {
  17. value = _value;
  18. next = NULL;
  19. prev = NULL;
  20. }
  21. };
  22.  
  23. // Struct thể hiện 1 danh sách liên kết, với head là node đầu tiên và last là node cuối cùng.
  24. struct LinkedList
  25. {
  26. Node* head = new Node();
  27. Node* last = new Node();
  28.  
  29. LinkedList()
  30. {
  31. head = NULL;
  32. last = NULL;
  33. }
  34.  
  35. void add_to_front(int value)
  36. {
  37. Node* new_node = new Node();
  38. new_node -> create_node(value);
  39.  
  40. if (head == NULL)
  41. head = last = new_node;
  42. else
  43. {
  44. new_node -> next = head;
  45. head -> prev = new_node;
  46. head = new_node;
  47. }
  48. }
  49.  
  50. void add_to_last(int value)
  51. {
  52. Node* new_node = new Node();
  53. new_node -> create_node(value);
  54.  
  55. // Danh sách rỗng thì gán luôn head bằng node mới.
  56. if (head == NULL)
  57. head = last = new_node;
  58. else
  59. {
  60. // Ngược lại, tạo một node p để duyệt tới phần tử cuối của danh sách.
  61. Node* p = new Node();
  62. p = head;
  63. while (p -> next != NULL)
  64. p = p -> next;
  65.  
  66. // Cho next của phần tử cuối trỏ tới node mới và prev của node mới trỏ vào phần tử cuối.
  67. // Cập nhật lại node cuối cùng của danh sách sẽ là node mới.
  68. p -> next = new_node;
  69. new_node -> prev = p;
  70. last = new_node;
  71. }
  72. }
  73.  
  74. void add_to_position(int value, int x)
  75. {
  76. // Danh sách đang rỗng hoặc x = 1 thì coi như là chèn vào đầu danh sách.
  77. if (x == 1 || head == NULL) // Có thể đổi thành x = 0 tùy vào cách đánh số danh sách.
  78. {
  79. add_to_front(value);
  80. return;
  81. }
  82.  
  83. // Đi tìm node ở vị trí x - 1.
  84. Node* p = new Node();
  85. p = head;
  86. int k = 1;
  87. while (p != NULL && k + 1 != x)
  88. {
  89. p = p -> next;
  90. ++k;
  91. }
  92.  
  93. // Không tìm được node ở vị trí x - 1 thì xử lý riêng.
  94. if (k + 1 != x)
  95. {
  96. // Thông báo vị trí không hợp lệ, hoặc có thể coi như chèn vào cuối danh sách.
  97. // add_to_last(value);
  98. cout << "Invalid position\n";
  99. return;
  100. }
  101.  
  102. // Chèn node mới vào sau vị trí k = x - 1, chính là vị trí x.
  103. Node* new_node = new Node();
  104. new_node -> create_node(value);
  105.  
  106. // Xử lý node mới chèn vào.
  107. new_node -> next = p -> next;
  108. new_node -> prev = p;
  109.  
  110. // Xử lý hai node trước và sau node mới chèn vào.
  111. if (p -> next != NULL)
  112. p -> next -> prev = new_node;
  113. p -> next = new_node;
  114. }
  115.  
  116. void del_front()
  117. {
  118. if (head == NULL)
  119. {
  120. cout << "The linked-list is empty!\n";
  121. return;
  122. }
  123.  
  124. head = head -> next;
  125. head -> prev = NULL;
  126. }
  127.  
  128. void del_at_position(int x)
  129. {
  130. if (x == 1 || head == NULL || head -> next == NULL) // Hoặc x = 0 tùy vào cách đánh số danh sách.
  131. {
  132. del_front();
  133. return;
  134. }
  135.  
  136. // Tìm phần tử liền trước vị trí cần xóa. Tối đa chỉ tới vị trí áp chót.
  137. Node* p = head;
  138. int k = 1;
  139. while (p -> next -> next != NULL && k != x - 1)
  140. {
  141. p = p -> next;
  142. ++k;
  143. }
  144.  
  145. // Đã duyệt tới phần tử áp chót mà vẫn chưa tới được phần tử liền trước
  146. // vị trí cần xóa, thì kết luận không tồn tại vị trí cần xóa.
  147. if (k != x - 1)
  148. {
  149. cout << "The position is invalid\n";
  150. return;
  151. }
  152.  
  153. // Đặt p -> next trỏ tới phần tử liền sau phần tử cần xóa.
  154. // Đặt prev của phần tử liền sau phần tử cần xóa trỏ vào p.
  155. if (p -> next -> next == NULL) // Xóa ở cuối.
  156. p -> next = NULL;
  157. else // Xóa ở giữa.
  158. {
  159. p -> next -> next -> prev = p;
  160. p -> next = p -> next -> next;
  161. }
  162. }
  163.  
  164. void print_list()
  165. {
  166. for (Node* p = head; p != NULL; p = p -> next)
  167. cout << p -> value << ' ';
  168. }
  169.  
  170. int value_at_index(int x)
  171. {
  172. int k = 1;
  173. Node* p = head;
  174. while (p -> next != NULL && k != x)
  175. {
  176. p = p -> next;
  177. ++k;
  178. }
  179.  
  180. return p -> value;
  181. }
  182.  
  183. void input_linked_list(int n)
  184. {
  185. for (int i = 1; i <= n; ++i)
  186. {
  187. int value;
  188. cin >> value;
  189.  
  190. add_to_last(value);
  191. }
  192. }
  193. };
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In constructor ‘Node::Node()’:
prog.cpp:11:16: error: ‘NULL’ was not declared in this scope
         next = NULL;
                ^~~~
prog.cpp:11:16: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp:1:1:
+#include <cstddef>
 // Struct thể hiện một node trên danh sách liên kết.
prog.cpp:11:16:
         next = NULL;
                ^~~~
prog.cpp: In member function ‘void Node::create_node(int)’:
prog.cpp:18:16: error: ‘NULL’ was not declared in this scope
         next = NULL;
                ^~~~
prog.cpp:18:16: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp: In constructor ‘LinkedList::LinkedList()’:
prog.cpp:31:16: error: ‘NULL’ was not declared in this scope
         head = NULL;
                ^~~~
prog.cpp:31:16: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp: In member function ‘void LinkedList::add_to_front(int)’:
prog.cpp:40:21: error: ‘NULL’ was not declared in this scope
         if (head == NULL)
                     ^~~~
prog.cpp:40:21: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp: In member function ‘void LinkedList::add_to_last(int)’:
prog.cpp:56:21: error: ‘NULL’ was not declared in this scope
         if (head == NULL)
                     ^~~~
prog.cpp:56:21: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp: In member function ‘void LinkedList::add_to_position(int, int)’:
prog.cpp:77:31: error: ‘NULL’ was not declared in this scope
         if (x == 1 || head == NULL) // Có thể đổi thành x = 0 tùy vào cách đánh số danh sách.
                               ^~~~
prog.cpp:77:31: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp:95:17: error: ‘cout’ was not declared in this scope
                 cout << "Invalid position\n";
                 ^~~~
prog.cpp: In member function ‘void LinkedList::del_front()’:
prog.cpp:118:21: error: ‘NULL’ was not declared in this scope
         if (head == NULL)
                     ^~~~
prog.cpp:118:21: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp:119:13: error: ‘cout’ was not declared in this scope
             cout << "The linked-list is empty!\n";
             ^~~~
prog.cpp:122:24: error: ‘NULL’ was not declared in this scope
         head -> prev = NULL;
                        ^~~~
prog.cpp:122:24: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp: In member function ‘void LinkedList::del_at_position(int)’:
prog.cpp:127:31: error: ‘NULL’ was not declared in this scope
         if (x == 1 || head == NULL || head -> next == NULL) // Hoặc x = 0 tùy vào cách đánh số danh sách.
                               ^~~~
prog.cpp:127:31: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp:133:37: error: ‘NULL’ was not declared in this scope
         while (p -> next -> next != NULL && k != x - 1)
                                     ^~~~
prog.cpp:133:37: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp:142:13: error: ‘cout’ was not declared in this scope
             cout << "The position is invalid\n";
             ^~~~
prog.cpp:147:38: error: ‘NULL’ was not declared in this scope
             if (p -> next -> next == NULL) // Xóa ở cuối.
                                      ^~~~
prog.cpp:147:38: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp: In member function ‘void LinkedList::print_list()’:
prog.cpp:159:35: error: ‘NULL’ was not declared in this scope
         for (Node* p = head; p != NULL; p = p -> next)
                                   ^~~~
prog.cpp:159:35: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp:160:13: error: ‘cout’ was not declared in this scope
             cout << p -> value << ' ';
             ^~~~
prog.cpp: In member function ‘int LinkedList::value_at_index(int)’:
prog.cpp:167:29: error: ‘NULL’ was not declared in this scope
         while (p -> next != NULL && k != x)
                             ^~~~
prog.cpp:167:29: note: ‘NULL’ is defined in header ‘<cstddef>’; did you forget to ‘#include <cstddef>’?
prog.cpp: In member function ‘void LinkedList::input_linked_list(int)’:
prog.cpp:181:13: error: ‘cin’ was not declared in this scope
             cin >> value;
             ^~~
stdout
Standard output is empty