Today we are gonna tell you the C++ Program to demonstrate circular doubly linked list. The C++ program is successfully compiled and runs on any system.
Here is the code :
#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;/** Node Declaration*/struct node{int info;struct node *next;struct node *prev;}*start, *last;int counter = 0;/** Class Declaration*/class double_clist{public:node *create_node(int);void insert_begin();void insert_last();void insert_pos();void delete_pos();void search();void update();void display();void reverse();void sort();double_clist(){start = NULL;last = NULL;}};/** Main: Contains Menu*/int main(){int choice;double_clist cdl;while (1){cout<<"\n-------------------------------"<<endl;cout<<"Operations on Doubly Circular linked list"<<endl;cout<<"\n-------------------------------"<<endl;cout<<"1.Insert at Beginning"<<endl;cout<<"2.Insert at Last"<<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.Sort"<<endl;cout<<"8.Display List"<<endl;cout<<"9.Reverse List"<<endl;cout<<"10.Exit"<<endl;cout<<"Enter your choice : ";cin>>choice;switch(choice){case 1:cdl.insert_begin();break;case 2:cdl.insert_last();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.sort();break;case 8:cdl.display();break;case 9:cdl.reverse();break;case 10:exit(1);default:cout<<"Wrong choice"<<endl;}}return 0;}/**MEMORY ALLOCATED FOR NODE DYNAMICALLY*/node* double_clist::create_node(int value){counter++;struct node *temp;temp = new(struct node);temp->info = value;temp->next = NULL;temp->prev = NULL;return temp;}/**INSERTS ELEMENT AT BEGINNING*/void double_clist::insert_begin(){int value;cout<<endl<<"Enter the element to be inserted: ";cin>>value;struct node *temp;temp = create_node(value);if (start == last && start == NULL){cout<<"Element inserted in empty list"<<endl;start = last = temp;start->next = last->next = NULL;start->prev = last->prev = NULL;}else{temp->next = start;start->prev = temp;start = temp;start->prev = last;last->next = start;cout<<"Element inserted"<<endl;}}/**INSERTS ELEMNET AT LAST*/void double_clist::insert_last(){int value;cout<<endl<<"Enter the element to be inserted: ";cin>>value;struct node *temp;temp = create_node(value);if (start == last && start == NULL){cout<<"Element inserted in empty list"<<endl;start = last = temp;start->next = last->next = NULL;start->prev = last->prev = NULL;}else{last->next = temp;temp->prev = last;last = temp;start->prev = last;last->next = start;}}/**INSERTS ELEMENT AT POSITION*/void double_clist::insert_pos(){int value, pos, i;cout<<endl<<"Enter the element to be inserted: ";cin>>value;cout<<endl<<"Enter the postion of element inserted: ";cin>>pos;struct node *temp, *s, *ptr;temp = create_node(value);if (start == last && start == NULL){if (pos == 1){start = last = temp;start->next = last->next = NULL;start->prev = last->prev = NULL;}else{cout<<"Position out of range"<<endl;counter--;return;}}else{if (counter < pos){cout<<"Position out of range"<<endl;counter--;return;}s = start;for (i = 1;i <= counter;i++){ptr = s;s = s->next;if (i == pos - 1){ptr->next = temp;temp->prev = ptr;temp->next = s;s->prev = temp;cout<<"Element inserted"<<endl;break;}}}}/** Delete Node at Particular Position*/void double_clist::delete_pos(){int pos, i;node *ptr, *s;if (start == last && start == NULL){cout<<"List is empty, nothing to delete"<<endl;return;}cout<<endl<<"Enter the postion of element to be deleted: ";cin>>pos;if (counter < pos){cout<<"Position out of range"<<endl;return;}s = start;if(pos == 1){counter--;last->next = s->next;s->next->prev = last;start = s->next;free(s);cout<<"Element Deleted"<<endl;return;}for (i = 0;i < pos - 1;i++ ){s = s->next;ptr = s->prev;}ptr->next = s->next;s->next->prev = ptr;if (pos == counter){last = ptr;}counter--;free(s);cout<<"Element Deleted"<<endl;}/** Update value of a particular node*/void double_clist::update(){int value, i, pos;if (start == last && start == NULL){cout<<"The List is empty, nothing to update"<<endl;return;}cout<<endl<<"Enter the postion of node to be updated: ";cin>>pos;cout<<"Enter the new value: ";cin>>value;struct node *s;if (counter < pos){cout<<"Position out of range"<<endl;return;}s = start;if (pos == 1){s->info = value;cout<<"Node Updated"<<endl;return;}for (i=0;i < pos - 1;i++){s = s->next;}s->info = value;cout<<"Node Updated"<<endl;}/** Search Element in the list*/void double_clist::search(){int pos = 0, value, i;bool flag = false;struct node *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>>value;s = start;for (i = 0;i < counter;i++){pos++;if (s->info == value){cout<<"Element "<<value<<" found at position: "<<pos<<endl;flag = true;}s = s->next;}if (!flag)cout<<"Element not found in the list"<<endl;}/** Sorting Doubly Circular Link List*/void double_clist::sort(){struct node *temp, *s;int value, i;if (start == last && start == NULL){cout<<"The List is empty, nothing to sort"<<endl;return;}s = start;for (i = 0;i < counter;i++){temp = s->next;while (temp != start){if (s->info > temp->info){value = s->info;s->info = temp->info;temp->info = value;}temp = temp->next;}s = s->next;}}/** Display Elements of the List*/void double_clist::display(){int i;struct node *s;if (start == last && start == NULL){cout<<"The List is empty, nothing to display"<<endl;return;}s = start;for (i = 0;i < counter-1;i++){cout<<s->info<<"<->";s = s->next;}cout<<s->info<<endl;}/** Reverse Doubly Circular Linked List*/void double_clist::reverse(){if (start == last && start == NULL){cout<<"The List is empty, nothing to reverse"<<endl;return;}struct node *p1, *p2;p1 = start;p2 = p1->next;p1->next = NULL;p1->prev = p2;while (p2 != start){p2->prev = p2->next;p2->next = p1;p1 = p2;p2 = p2->prev;}last = start;start = p1;cout<<"List Reversed"<<endl;}
OUTPUT (screenshot):



Comments
Post a Comment