Saturday, 19 September 2020

Doubly Circular Linked List with all possible (CRUD) operation in C++

#include<iostream>

using namespace std;


//fun prototype 

void create();

void display();

void rev();

void insert();

void insertAtBeg();

void insertAtPos();

void insertAtEnd();

void del();

void delAtBeg();

void delAtEnd();

void delAtPos();

struct node

{

int data;

struct node*next;

struct node*prev;

};

struct node *head=NULL;

struct node *tail=NULL;

int len=0;



int main()

{

  int choice;

 while(1)

 {

  cout<<"\n\n\n\t\t\t\t******MENU********\n\n";

  cout<<"\n1 Create firstnode or Append\n2 display\n3 for inserting node\n";

  cout<<"4 for length \n5 for deletion \n6 for reversing the  list\n";

  cin>>choice;

  switch(choice)

  {

  case 1:create();

  break;

  case 2:display();

  break;

  case 3:insert();

  break;

  case 4:cout<<"length of list = "<<len<<"\n";

  break;

  case 5:del();

  break;

  case 6: rev();

  break;

  case 0:exit(1);

  break;

  default: cout<<" wrong  choice\n:";

  break;

  }

}


}



void insert()

{

int choice;

  cout<<"\n\n\n\t\t\t\t\t******MENU********\n";

  cout<<"\n1 for insertion At Beg\n2 Insert on a specific Pos\n3 for insert at end\n";

  cin>>choice;

  switch(choice)

  {

  case 1:insertAtBeg();

  break;

  case 2:insertAtPos();

  break;

  case 3:insertAtEnd();

  break;

  default: cout<<" wrong  choice for inserting\n:";

  break;

  }

}


void del()

{

int choice;

  cout<<"\n\n\n\t\t\t\t\t******MENU********\n\n";

  cout<<"\n1 for deletion 1st node \n2 for deletion last node\n3 for deletion at a given pos\n";

  cin>>choice;

  switch(choice)

  {

  case 1:delAtBeg();

  break;

  case 2:delAtEnd();

  break;

  case 3:delAtPos();

  break;

  default: cout<<" wrong  choice for inserting\n:";

  break;

  }

}


void create()

{

struct node*newnode;

newnode = new node;

int data;

cout<<"enter data  ";

cin>>data;

newnode->data=data;


if (head == NULL)

{

head = newnode;

tail = newnode;

head->next=head;

head->prev=head;

cout<<"\n first node created successfully\n";

len++;

}

else

{

tail->next = newnode;

newnode->prev = tail;

tail = newnode;

tail->next=head;

head->prev = tail;

cout<<"\n node created successfully\n";

len++;

}

}

void display()

{

//cout<<"in display\n";

struct node *temp;

if(head == NULL)

{

cout<<"empty";

}

else

{

temp=head;

cout<<"head->";

while(temp->next!=head)

{

cout<<temp->data<<"->";

temp=temp->next;

}

cout<<temp->data<<"->head";

// cout<<temp->next->data; // for checking it is circular or not

}

}


void insertAtBeg()

{

struct node*newnode;

newnode = new node;

int data;

if(head==NULL)

{

create();

}

else

{

cout<<"enter data  ";

cin>>data;

newnode->data=data;

newnode->next = NULL;

newnode->next = head;//address of 1st node 

head = newnode;

tail->next = head;

head->prev = tail;

}

cout<<"node added successfully";

len++;

}

void insertAtEnd()

{

struct node*newnode;

newnode = new node;

int data;


if(head==NULL)

{

cout<<"empty list";

create();

}

else

{

cout<<"enter data  ";

cin>>data;

newnode->data=data;

newnode->next = head;//address of 1st node 

newnode->prev = tail;// address of last node

tail->next = newnode;

tail = newnode;

head->prev = tail;

}

cout<<"node added successfully";

len++;

}

void insertAtPos()

{

int pos,i;

i=1;

cout<<"enter the pos\n" ;

cin>>pos;

if(pos==1)

{

insertAtBeg();

}

else if(pos == len)

{

insertAtEnd();

}

else if(pos<1 || pos>len)

{

cout<<"invalid pos";

}

else

{

struct node*newnode;

newnode = new node;

struct node*temp;

int data;

cout<<"enter data\n";

cin>>data;

newnode->data=data;

newnode->next = NULL;

temp = head; // point to 1st node

while(i<pos-1)

{

temp=temp->next;

i++;

}

newnode->next = temp->next;

newnode->prev = temp;

temp->next = newnode;

temp->next->prev = newnode;

len++;

}

}

void delAtBeg()

{

struct node*temp;

temp = head;

if(head == NULL)

cout<<"empty list";

else if(len==1)

{

head = NULL;

delete temp;

len--;

}

else

{

head=head->next;

tail->next = head;

head->prev=tail;

cout<<"deleted element is -> "<<temp->data;

delete temp;

len--;

}

}

void delAtEnd()

{

struct node*cur,*prev;

cur = head;

if(head == NULL)

cout<<"empty list";

else if(len==1)

{

head = NULL;

delete cur;

len--;

}

else

{

while(cur->next!=head)

{

prev=cur;

cur=cur->next;

}

//now cur is on last node and prev is on one before

prev->next = head;

tail=prev;

head->prev=tail;

cout<<"deleted element is -> "<<cur->data;

delete cur;

len--;

}

}

void delAtPos()

{

struct node*cur,*nextnode;

int i=1;

int pos;

cur=head;

cout<<"Enter the position ";

cin>>pos;

if(pos<1 || pos>len)

cout<<"invalid";

else if(pos==1)

delAtBeg();

else if(pos==len)

delAtEnd();

else

{

while(i<pos-1)

{

cur = cur->next;

i++;

}

nextnode = cur->next;

cur->next = nextnode->next;

nextnode->next->prev=cur;

cout<<"Deleted item is "<<nextnode->data;

delete nextnode;

len--;

}

}

void rev()

{

//now for reversing we need 3 pointers

struct node*cur,*prev,*next;

cur = head;

next = cur->next;

if(head == 0)

cout<<"empty\n";

else if(cur->next == cur)

cout<<"only one node";

else

{

while(cur!=tail)

{

prev = cur;

cur=next;

next = cur->next;

cur->next = prev;

cur->prev = next;

}

next->next = tail;

next->prev = tail->next;

tail = next;

head = tail->next;

cout<<"reverse succesfully\n";

}

display();

}


No comments:

Post a Comment