#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();
}