fork download
  1. #include <iostream>
  2. using namespace std;
  3. struct Node {
  4. int data;
  5. Node* prev;
  6. Node* next;
  7. };
  8. Node* head = nullptr;
  9. Node* tail = nullptr;
  10. // แสดงรายการทั้งหมด
  11. void displayList() {
  12. Node* curr = head;
  13. while (curr != nullptr) {
  14. cout << curr->data << " ";
  15. curr = curr->next;
  16. }
  17. cout << endl;
  18. }
  19. // เพิ่มที่ต้น
  20. void insertFirst(int value) {
  21. Node* newNode = new Node{value, nullptr, head};
  22. if (head != nullptr)
  23. head->prev = newNode;
  24. else
  25. tail = newNode;
  26. head = newNode;
  27. }
  28. // เพิ่มที่ท้าย
  29. void insertLast(int value) {
  30. Node* newNode = new Node{value, tail, nullptr};
  31. if (tail != nullptr)
  32. tail->next = newNode;
  33. else
  34. head = newNode;
  35. tail = newNode;
  36. }
  37. // เพิ่มที่ต าแหน่งกลาง (index เริ่มจาก 0)
  38. void insertAt(int index, int value) {
  39. if (index <= 0) {
  40. insertFirst(value);
  41. return;
  42. }
  43. Node* curr = head;
  44. int pos = 0;
  45. while (curr != nullptr && pos < index) {
  46. curr = curr->next;
  47. pos++;
  48. }
  49. if (curr == nullptr) {
  50. insertLast(value);
  51. } else {
  52. Node* newNode = new Node{value, curr->prev, curr};
  53. if (curr->prev != nullptr)
  54. curr->prev->next = newNode;
  55. curr->prev = newNode;
  56. if (curr == head)
  57. head = newNode;
  58. }
  59. }
  60. // ลบที่ต้น
  61. void removeFirst() {
  62. if (head == nullptr) return;
  63. Node* temp = head;
  64. head = head->next;
  65. if (head != nullptr)
  66. head->prev = nullptr;
  67. else
  68. tail = nullptr;
  69. delete temp;
  70. }
  71. // ลบที่ท้าย
  72. void removeLast() {
  73. if (tail == nullptr) return;
  74. Node* temp = tail;
  75. tail = tail->prev;
  76. if (tail != nullptr)
  77. tail->next = nullptr;
  78. else
  79. head = nullptr;
  80. delete temp;
  81. }
  82. // ลบที่ต าแหน่งกลาง (index เริ่มจาก 0)
  83. void removeAt(int index) {
  84. if (index < 0 || head == nullptr) return;
  85. if (index == 0) {
  86. removeFirst();
  87. return;
  88. }
  89. Node* curr = head;
  90. int pos = 0;
  91. while (curr != nullptr && pos < index) {
  92. curr = curr->next;
  93. pos++;
  94. }
  95. if (curr == nullptr) return; // ต าแหน่งเกิน
  96. if (curr->prev != nullptr)
  97. curr->prev->next = curr->next;
  98. if (curr->next != nullptr)
  99. curr->next->prev = curr->prev;
  100. if (curr == tail)
  101. tail = curr->prev;
  102. if (curr == head)
  103. head = curr->next;
  104. delete curr;
  105. }
  106. int main() {
  107. // เพิ่มข้อมูล
  108. insertFirst(10); // 10
  109. insertLast(40); // 10 40
  110. insertAt(1, 20); // 10 20 40
  111. insertAt(2, 30); // 10 20 30 40
  112. cout << "Initial list: ";
  113. displayList(); // Output: 10 20 30 40
  114. // ลบโหนด
  115. removeFirst(); // ลบ 10
  116. removeAt(1); removeLast(); // ลบ 40
  117. // ลบ 30 (index 1)
  118. cout << "Final list: ";
  119. displayList(); // Output: 20
  120. return 0;
  121. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Initial list: 10 20 30 40 
Final list: 20