Saturday, 19 September 2020

Circular Linked List with All possible operations 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 *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;
newnode->next = NULL;
if (head == NULL)
{
head = newnode;
tail = newnode;
//tail->next = head;
cout<<"\n first node created successfully\n";
len++;
}
else
{
tail->next = newnode;
tail = newnode;
//tail->next = head;
cout<<"\n node created successfully\n";
len++;
}
// now for linking tail to head
tail->next = head;
}
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->data;
}
}

void insertAtBeg()
{
struct node*newnode;
newnode = new node;
int data;
cout<<"enter data  ";
cin>>data;
newnode->data=data;
newnode->next = NULL;
if(head==NULL)
{
head = newnode;
tail = newnode;
head->next=head;
}
else
{
newnode->next = head;//address of 1st node 
head = newnode;
tail->next = head;
}
cout<<"node added successfully";
len++;
}
void insertAtEnd()
{
struct node*newnode;
newnode = new node;
int data;
cout<<"enter data  ";
cin>>data;
newnode->data=data;
newnode->next = NULL;
if(head==NULL)
{
cout<<"empty list";
head = newnode;
tail = newnode;
head->next=head;
}
else
{
newnode->next = tail->next;//address of 1st node 
tail->next = newnode;
tail = newnode;
}
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 = tail->next; // point to 1st node
while(i<pos-1)
{
temp=temp->next;
i++;
}
newnode->next = temp->next;
temp->next = newnode;
len++;
}
}
void delAtBeg()
{
struct node*temp;
temp = head;
if(head == NULL)
cout<<"empty list";
else if(len==1)
{
head = NULL;
cout<<"deleted element is -> "<<temp->data;
delete temp;
len--;
}
else
{
head=head->next;
tail->next = head;
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;
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;
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\n";
else
{
while(cur!=tail)
{
prev = cur;
cur=next;
next = cur->next;
cur->next = prev;
}
next->next = tail;
tail = next;
head = tail->next;
cout<<"reverse succesfully\n";
}
display();
}



No comments:

Post a Comment