รายการที่เชื่อมโยงแบบทวีคูณเป็นโครงสร้างข้อมูลประเภทหนึ่งที่ประกอบด้วยโหนดที่สร้างขึ้นโดยใช้โครงสร้างการอ้างอิงตนเอง แต่ละโหนดเหล่านี้ประกอบด้วยสามส่วน ได้แก่ ข้อมูลและการอ้างอิงไปยังโหนดรายการถัดไป และการอ้างอิงไปยังโหนดรายการก่อนหน้า
จำเป็นต้องอ้างอิงถึงโหนดรายการแรกเท่านั้นเพื่อเข้าถึงรายการที่เชื่อมโยงทั้งหมด นี้เรียกว่าหัว โหนดสุดท้ายในรายการชี้ไปที่ไม่มีอะไรเลย ดังนั้นจึงเก็บค่า NULL ไว้ในส่วนนั้น นอกจากนี้ รายการที่เชื่อมโยงแบบทวีคูณสามารถข้ามไปได้ทั้งสองทิศทาง เนื่องจากแต่ละโหนดจะชี้ไปยังโหนดก่อนหน้าและโหนดถัดไป
มีโปรแกรมสำหรับใช้งานรายการเชื่อมโยงแบบทวีคูณดังนี้
ตัวอย่าง
#include <iostream> using namespace std; struct Node { int data; struct Node *prev; struct Node *next; }; struct Node* head = NULL; void insert(int newdata) { struct Node* newnode = (struct Node*) malloc(sizeof(struct Node)); newnode->data = newdata; newnode->prev = NULL; newnode->next = head; if(head != NULL) head->prev = newnode ; head = newnode; } void display() { struct Node* ptr; ptr = head; while(ptr != NULL) { cout<< ptr->data <<" "; ptr = ptr->next; } } int main() { insert(3); insert(1); insert(7); insert(2); insert(9); cout<<"The doubly linked list is: "; display(); return 0; }
ผลลัพธ์
The doubly linked list is: 9 2 7 1 3
ในโปรแกรมข้างต้น โครงสร้างโหนดจะสร้างโหนดรายการที่มีการเชื่อมโยงแบบทวีคูณ ประกอบด้วยข้อมูลและตัวชี้ไปยังโหนดรายการที่เชื่อมโยงถัดไปและก่อนหน้า ได้ดังนี้
struct Node { int data; struct Node *prev; struct Node *next; };
ฟังก์ชัน insert() แทรกข้อมูลลงในจุดเริ่มต้นของรายการที่เชื่อมโยงเป็นสองเท่า มันสร้างโหนดใหม่และแทรกตัวเลขในฟิลด์ข้อมูลของโหนดใหม่ จากนั้นตัวชี้ก่อนหน้าในโหนดใหม่จะชี้ไปที่ NULL เมื่อป้อนไว้ที่จุดเริ่มต้น และตัวชี้ถัดไปจะชี้ไปที่ส่วนหัว ถ้า head ไม่เป็น NULL ให้ prev pointer ของ head ชี้ไปที่ newnode ในที่สุดส่วนหัวก็คือโหนดใหม่นั่นคือรายการที่เชื่อมโยงเริ่มต้นจากที่นั่น ด้านล่างนี้
void insert(int newdata) { struct Node* newnode = (struct Node*) malloc(sizeof(struct Node)); newnode->data = newdata; newnode->prev = NULL; newnode->next = head; if(head != NULL) head->prev = newnode ; head = newnode; }
ฟังก์ชั่น display() แสดงรายการที่เชื่อมโยงเป็นสองเท่าทั้งหมด ptr แรกชี้ไปที่หัว จากนั้นจะส่งต่อไปยังโหนดถัดไปอย่างต่อเนื่องจนกว่าจะพิมพ์ค่าข้อมูลทั้งหมดของโหนด ด้านล่างนี้
void display() { struct Node* ptr; ptr = head; while(ptr != NULL) { cout<< ptr->data <<" "; ptr = ptr->next; } }
ในฟังก์ชัน main() ค่าต่าง ๆ แรกจะถูกแทรกลงในรายการที่เชื่อมโยงเป็นสองเท่าโดยการเรียก insert() จากนั้นแสดงรายการที่เชื่อมโยงแบบทวีคูณ ด้านล่างนี้
int main() { insert(3); insert(1); insert(7); insert(2); insert(9); cout<<"The doubly linked list is: "; display(); return 0; }