การจัดการข้อมูลเป็นหนึ่งในงานที่สำคัญมากในการเขียนโปรแกรม เนื่องจากข้อมูลเป็นสิ่งที่จำเป็นในการทำงานของโปรแกรมต่างๆ Doubly Linked List เป็นโครงสร้างข้อมูลที่มีความได้เปรียบในการจัดการข้อมูลแบบไดนามิคเมื่อเทียบกับอาเรย์หรือโครงสร้างข้อมูลอื่นๆ เช่น singly linked lists หรือ array lists เนื่องจากมีความยืดหยุ่นในการเพิ่มและลบข้อมูลจากตำแหน่งใดก็ได้ภายใน list โดยไม่จำเป็นต้องขนานข้อมูลใหม่ทั้งหมดอย่างที่ array ปกติทำ
ต่อไปนี้เป็นตัวอย่างโค้ดเบื้องต้นสำหรับ Doubly Linked List ใน C++ พร้อมกับเทคนิคต่างๆในการจัดการข้อมูล:
#include
using namespace std;
// ระบุโครงสร้างของ node สำหรับ doubly linked list
struct Node {
int data;
Node* next;
Node* prev;
};
// เพิ่ม node ที่หน้าสุดของ list
void insertAtFront(Node** head, int newData) {
// สร้าง node ใหม่
Node* newNode = new Node();
newNode->data = newData;
// ตั้งค่า next ของ newNode ให้ชี้ไปที่ head และ prev เป็น NULL
newNode->next = (*head);
newNode->prev = NULL;
// อัพเดท prev ของ head node เป็น newNode
if ((*head) != NULL) {
(*head)->prev = newNode;
}
// ย้าย head ให้ชี้มาที่ newNode
(*head) = newNode;
}
// ใส่ข้อมูลใน list
void insert(Node* prev_node, int newData) {
// ตรวจสอบว่า prev_node นั้นไม่เป็น NULL
if (prev_node == NULL) {
cout << "Prev_node cannot be NULL";
return;
}
// สร้าง newNode
Node* newNode = new Node();
newNode->data = newData;
// ตั้งค่า next ของ newNode ให้ชี้ไปยัง next ของ prev_node
newNode->next = prev_node->next;
// ตั้งค่า next ของ prev_node เป็น newNode
prev_node->next = newNode;
// ตั้งค่า prev ของ newNode เป็น prev_node
newNode->prev = prev_node;
// เปลี่ยน prev ของ newNode ต่อไปให้เป็น newNode (ถ้า newNode ไม่ใช่ node สุดท้าย)
if (newNode->next != NULL) {
newNode->next->prev = newNode;
}
}
// ลบ node ออกจาก list
void deleteNode(Node** head, Node* del_node) {
// ตรวจสอบว่า head และ del_node ไม่เป็น NULL
if (*head == NULL || del_node == NULL) return;
// ถ้า node ที่จะลบคือ head node
if (*head == del_node) {
*head = del_node->next;
}
// เปลี่ยน next เฉพาะเมื่อ node ที่ลบไม่ได้เป็น node สุดท้าย
if (del_node->next != NULL) {
del_node->next->prev = del_node->prev;
}
// เปลี่ยน prev เฉพาะเมื่อ node ที่ลบไม่ได้อยู่ที่เริ่มต้น
if (del_node->prev != NULL) {
del_node->prev->next = del_node->next;
}
// ปล่อย memory ของ del_node
free(del_node);
}
// ค้นหา node ด้วยค่าที่กำหนด
Node* find(Node* head, int searchValue) {
Node* current = head;
while(current != NULL) {
if (current->data == searchValue) {
return current;
}
current = current->next;
}
return NULL; // ไม่พบค่าที่กำหนด
}
ข้อดีของ Doubly Linked List คือความสามารถในการเดินทางไปมาใน list ได้อย่างอิสระ ทำให้ง่ายต่อการจัดการข้อมูล เช่น insert, delete โดยไม่ต้อง iterate ทั้งหมด นอกจากนี้ยังสามารถเข้าถึงข้อมูลก่อนหน้า(divide-and-conquer algorithm)ในอีกทางหนึ่งได้ง่ายด้วยเป็นการเพิ่มความยืดหยุ่นในการออกแบบและการใช้งาน
อย่างไรก็ตาม Doubly Linked List ยังมีข้อเสียบางประการ ดังนี้:
1. ใช้ memory เพิ่ม เนื่องจากต้องจัดเก็บค่า prev เพิ่มอีกหนึ่งฟิลด์ นอกจาก data และ next ที่ singly linked list มี
2. โค้ดอาจซับซ้อนกว่าในบาง operation เช่น ในการลบข้อมูลที่ต้องอัพเดทระหว่างเชื่อมโยงของ node ก่อนหน้าและถัดไป
3. การจัดการ memory ที่ยากขึ้น เนื่องจากหากไม่มีการเขียนโปรแกรมเพื่อการจัดการ memory อย่างรอบคอบอาจเกิด memory leak
การทำความเข้าใจกับโครงสร้างข้อมูลหลักทำให้การพัฒนาโปรแกรมคุณภาพสูงเป็นไปได้ด้วยความง่ายดายมากขึ้น นอกจากนี้ยังช่วยให้สามารถเลือกใช้โครงสร้างข้อมูลที่เหมาะสมกับข้อกำหนดของโปรแกรมได้อย่างดีที่สุด ที่ EPT หรือ Expert-Programming-Tutor, เราสอนนักเรียนให้เข้าใจหลักการเหล่านี้พร้อมทั้งฝึกฝนและปรับปรุงทักษะการเขียนโค้ด เพื่อให้พวกเขาพร้อมสำหรับการทำงานในสายอาชีพนี้ หากคุณมีความสนใจในการเรียนรู้การเขียนโปรแกรม, Doubly Linked List เป็นหนึ่งในหลายๆเรื่องที่คุณจะได้เรียนรู้กับเราที่ EPT!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM