Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ สำหรับการนำรายการเชื่อมต่อคู่แบบวงกลม (Circular Doubly Linked List) มาใช้งาน


ในโครงสร้างข้อมูล รายการเชื่อมต่อ (Link List) เป็นการรวบรวมข้อมูลแบบเส้นตรง แต่ละองค์ประกอบหรือโหนดของรายการประกอบด้วยสองรายการ - ข้อมูลและการอ้างอิงไปยังโหนดถัดไป โหนดสุดท้ายมีการอ้างอิงไปยัง null ในรายการเชื่อมต่อ จุดเข้าถึงเรียกว่า head ของรายการ

ในรายการเชื่อมต่อคู่แบบวงกลม (Circular Doubly Linked List) สององค์ประกอบที่ติดกันจะถูกลิงก์หรือเชื่อมต่อโดยพอยน์เตอร์ previous และ next และโหนดสุดท้ายจะชี้ไปยังโหนดแรกโดยพอยน์เตอร์ next และโหนดแรกก็ชี้ไปยังโหนดสุดท้ายโดยพอยน์เตอร์ previous

อัลกอริทึม

Begin   เราจะสร้างคลาส circulardoublylist ซึ่งมีฟังก์ชันต่อไปนี้:     nod *create_node(int) = เพื่อจัดสรรหน่วยความจำสำหรับโหนดแบบไดนามิก     insert_begin() = เพื่อแทรกองค์ประกอบที่จุดเริ่มต้นของรายการ       A) ถ้ารายการว่าง ให้แทรกโหนดและตั้งค่าพอยน์เตอร์ next และ previous เป็น NULL       B) ถ้ารายการไม่ว่าง ให้แทรกข้อมูลและตั้งค่าพอยน์เตอร์ next และ previous และอัปเดตพวกเขา     insert_end() = เพื่อแทรกองค์ประกอบที่จุดสิ้นสุดของรายการ:       A) ถ้ารายการว่าง สร้างโหนดเป็นรายการเชื่อมต่อคู่แบบวงกลม       B) ค้นหาโหนดสุดท้าย       C) สร้างโหนดแบบไดนามิก       D) Start จะเป็น next ของโหนดใหม่       E) ทำให้โหนดใหม่เป็นโหนดก่อนหน้า       F) ทำให้ last เป็น previous ของโหนดใหม่       G) ทำให้โหนดใหม่เป็น next ของ last เก่า     insert_pos() = เพื่อแทรกองค์ประกอบที่ตำแหน่งที่ระบุของรายการ:       A) แทรกข้อมูล       B) ป้อนตำแหน่งที่องค์ประกอบจะถูกแทรก       C) ถ้ารายการว่าง แทรกโหนดที่ตัวแรก       D) ถ้ารายการไม่ว่าง ค้นหาโหนดที่มีตำแหน่งและโหนดถัดไป       E) แทรกโหนดระหว่างพวกเขา     delete_pos() = เพื่อลบองค์ประกอบจากตำแหน่งที่ระบุของรายการ:       A) ถ้ารายการว่าง ให้คืนค่า       B) ป้อนตำแหน่งที่ต้องการลบโหนด       C) ถ้ารายการมีโหนดเดียว ให้ลบและอัปเดตพอยน์เตอร์ next และ prev       D) ถ้ารายการมีมากกว่าหนึ่งโหนด ให้ลบโหนดที่ตำแหน่งเฉพาะและอัปเดตพอยน์เตอร์ next และ prev     search() = เพื่อค้นหาองค์ประกอบในรายการ:       A) ถ้ารายการว่าง ให้คืนค่า       B) ป้อนค่าที่ต้องการค้นหา       C) พิมพ์ตำแหน่งที่พบองค์ประกอบ       D) ถ้าไม่พบองค์ประกอบ ให้พิมพ์ not found     update() = เพื่ออัปเดตค่าที่โหนดเฉพาะ:       A) ถ้ารายการว่าง ให้คืนค่า       B) ป้อนตำแหน่งของโหนดที่ต้องการอัปเดต       C) ป้อนค่าใหม่       D) อัปเดตโหนด       display() = เพื่อแสดงรายการ       reverse() = เพื่อกลับลำดับรายการ End

ตัวอย่างโค้ด

#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; struct nod {   int info;   struct nod *n;   struct nod *p; }*start, *last; int count = 0; class circulardoublylist {   public:     nod *create_node(int);     void insert_begin();     void insert_end();     void insert_pos();     void delete_pos();     void search();     void update();     void display();     void reverse();     circulardoublylist() {       start = NULL;       last = NULL;     } }; int main() {   int c;   circulardoublylist cdl;   while (1) //perform switch operation {     cout<<"1.Insert at Beginning"<<endl;     cout<<"2.Insert at End"<<endl;     cout<<"3.Insert at Position"<<endl;     cout<<"4.Delete at Position"<<endl;     cout<<"5.Update Node"<<endl;     cout<<"6.Search Element"<<endl;     cout<<"7.Display List"<<endl;     cout<<"8.Reverse List"<<endl;     cout<<"9.Exit"<<endl;     cout<<"Enter your choice : ";     cin>>c;     switch(c) {       case 1:         cdl.insert_begin();         break;       case 2:         cdl.insert_end();         break;       case 3:         cdl.insert_pos();         break;       case 4:         cdl.delete_pos();         break;       case 5:         cdl.update();         break;       case 6:         cdl.search();         break;       case 7:         cdl.display();         break;       case 8:         cdl.reverse();         break;       case 9:         exit(1);         default:         cout<<"Wrong choice"<<endl;     }   }   return 0; } nod* circulardoublylist::create_node(int v) {   count++;   struct nod *t;   t = new(struct nod);   t->info = v;   t->n = NULL;   t->p = NULL;   return t; } void circulardoublylist::insert_begin() {   int v;   cout<<endl<<"Enter the element to be inserted: ";   cin>>v;   struct nod *t;   t = create_node(v);   if (start == last && start == NULL) {     cout<<"Element inserted in empty list"<<endl;     start = last = t;     start->n = last->n = NULL;     start->p = last->p = NULL;   } else {     t->n = start;     start->p = t;     start = t;     start->p = last;     last->n = start;     cout<<"Element inserted"<<endl;   } } void circulardoublylist::insert_end() {   int v;   cout<<endl<<"Enter the element to be inserted: ";   cin>>v;   struct nod *t;   t = create_node(v);   if (start == last && start == NULL) {     cout<<"Element inserted in empty list"<<endl;     start = last = t;     start->n= last->n = NULL;     start->p = last->p= NULL;   } else {     last->n= t;     t->p= last;     last = t;     start->p = last;     last->n= start;   } } void circulardoublylist::insert_pos() {   int v, pos, i;   cout<<endl<<"Enter the element to be inserted: ";   cin>>v;   cout<<endl<<"Enter the position of element inserted: ";   cin>>pos;   struct nod *t, *s, *ptr;   t = create_node(v);   if (start == last && start == NULL) {     if (pos == 1) {       start = last = t;       start->n = last->n = NULL;       start->p = last->p = NULL;     } else {       cout<<"Position out of range"<<endl;       count--;       return;     }   } else {     if (count < pos) {       cout<<"Position out of range"<<endl;       count--;       return;     }     s = start;     for (i = 1;i <= count;i++) {       ptr = s;       s = s->n;       if (i == pos - 1) {         ptr->n = t;         t->p= ptr;         t->n= s;         s->p = t;         cout<<"Element inserted"<<endl;         break;       }     }   } } void circulardoublylist::delete_pos() {   int pos, i;   nod *ptr, *s;   if (start == last && start == NULL) {     cout<<"List is empty, nothing to delete"<<endl;     return;   }   cout<<endl<<"Enter the position of element to be deleted: ";   cin>>pos;   if (count < pos) {     cout<<"Position out of range"<<endl;     return;   }   s = start;   if(pos == 1) {     count--;     last->n = s->n;     s->n->p = last;     start = s->n;     free(s);     cout<<"Element Deleted"<<endl;     return;   }   for (i = 0;i < pos - 1;i++ ) {     s = s->n;     ptr = s->p;   }   ptr->n = s->n;   s->n->p = ptr;   if (pos == count) {     last = ptr;   }   count--;   free(s);   cout<<"Element Deleted"<<endl; } void circulardoublylist::update() {   int v, i, pos;   if (start == last && start == NULL) {     cout<<"The List is empty, nothing to update"<<endl;     return;   }   cout<<endl<<"Enter the position of node to be updated: ";   cin>>pos;   cout<<"Enter the new value: ";   cin>>v;   struct nod *s;   if (count < pos) {     cout<<"Position out of range"<<endl;     return;   }   s = start;   if (pos == 1) {     s->info = v;     cout<<"Node Updated"<<endl;     return;   }   for (i=0;i < pos - 1;i++) {     s = s->n;   }   s->info = v;   cout<<"Node Updated"<<endl; } void circulardoublylist::search() {   int pos = 0, v, i;   bool flag = false;   struct nod *s;   if (start == last && start == NULL) {     cout<<"The List is empty, nothing to search"<<endl;     return;   }   cout<<endl<<"Enter the value to be searched: ";   cin>>v;   s = start;   for (i = 0;i < count;i++) {     pos++;     if (s->info == v) {       cout<<"Element "<<v<<" found at position: "<<pos<<endl;       flag = true;     }     s = s->n;   }   if (!flag)     cout<<"Element not found in the list"<<endl; } void circulardoublylist::display() {   int i;   struct nod *s;   if (start == last && start == NULL) {     cout<<"The List is empty, nothing to display"<<endl;     return;   }   s = start;   for (i = 0;i < count-1;i++) {     cout<<s->info<<"<->";     s = s->n;   }   cout<<s->info<<endl; } void circulardoublylist::reverse() {   if (start == last && start == NULL) {     cout<<"The List is empty, nothing to reverse"<<endl;     return;   }   struct nod *p1, *p2;   p1 = start;   p2 = p1->n;   p1->n = NULL;   p1->p= p2;   while (p2 != start) {     p2->p = p2->n;     p2->n = p1;     p1 = p2;     p2 = p2->p;   }   last = start;   start = p1;   cout<<"List Reversed"<<endl; }

ผลลัพธ์

1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 1 Enter the element to be inserted: 7 Element inserted in empty list 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 1 Enter the element to be inserted: 6 Element inserted 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 2 Enter the element to be inserted: 4 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 2 Enter the element to be inserted: 5 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 7 6<->7<->4<->5 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 6 Enter the value to be searched: 7 Element 7 found at position: 2 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 6 Enter the value to be searched: 2 Element not found in the list 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 4 Enter the position of element to be deleted: 4 Element Deleted 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 3 Enter the element to be inserted: 5 Enter the position of element inserted: 2 Element inserted 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 7 6<->5<->7<->4 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 8 List Reversed 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 7 4<->7<->5<->6 1.Insert at Beginning 2.Insert at End 3.Insert at Position 4.Delete at Position 5.Update Node 6.Search Element 7.Display List 8.Reverse List 9.Exit Enter your choice : 9