#include<iostream.h>
#include<conio.h>
#include<stdio.h>
struct doublylist
{
int no;
struct doublylist *next;
struct doublylist *prev;
};
void display(struct doublylist *head);
struct doublylist* deletevalue(struct doublylist *head);
struct doublylist* insertmiddle(struct doublylist *head);
struct doublylist* insertfirst(struct doublylist *head);
struct doublylist* deletefirst(struct doublylist *head);
struct doublylist* append(struct doublylist *head);
struct doublylist* insertfirst_copy(struct doublylist *head,int key);
struct doublylist* append_copy(struct doublylist *head,int key);
struct doublylist* copy(struct doublylist *head);
void reverse(struct doublylist *head);
main()
{
struct doublylist *first=NULL,*trav=NULL,*temp=NULL;
char choice;
first=new doublylist;
trav=first;
while(1)
{
cout<<"Enter the no : ";
cin>>trav->no;
cout<<"Do you continue [n/N] : ";
cin>>choice;
if(choice == 'n' || choice =='N')
break;
temp=new doublylist;
trav->next=temp;
temp->prev =trav;
temp->next=NULL;
trav=trav->next;
}
first->prev=trav;
trav->next=first;
clrscr();
while(1)
{
cout<<endl<<"1. Append";
cout<<endl<<"2. Delete first";
cout<<endl<<"3. Insert first";
cout<<endl<<"4. Insert middle";
cout<<endl<<"5. Delete by value";
cout<<endl<<"6. Copy";
cout<<endl<<"7. Reverse";
cout<<endl<<"8. Display";
cout<<endl<<"9. Exit";
cout<<endl<<"Enter the choice : ";
cin>>choice;
switch(choice)
{
case'1':
first=append(first);
break;
case'2':
first=deletefirst(first);
break;
case'3':
first=insertfirst(first);
break;
case'4':
first=insertmiddle(first);
break;
case'5':
first=deletevalue(first);
break;
case'6':
struct doublylist *first_copy;
first_copy=copy(first);
display(first_copy);
break;
case'7':
reverse(first_copy);
break;
case'8':
display(first);
getch();
break;
case'9':
return(0);
}
}
}
struct doublylist* append(struct doublylist *head)
{
if(head==NULL)
{
head=new doublylist;
cout<<"Enter the no : ";
cin>>head->no;
head->next=head;
head->prev=head;
return (head);
}
struct doublylist *trav=NULL,*temp=NULL;
for(trav=head;trav->next!=head;trav=trav->next);
temp=new doublylist;
cout<<"Enter the no : ";
cin>>temp->no;
trav->next=temp;
temp->prev=trav;
temp->next=head;
head->prev=temp;
return(head);
}
struct doublylist* deletefirst(struct doublylist *head)
{
struct doublylist *temp;
if(head==NULL)
{
cout<<"empty list";
return(NULL);
}
if(head->next==NULL)
{
delete head;
return(NULL);
}
temp=head;
struct doublylist *trav;
for(trav=head;trav->next!=head;trav=trav->next);
head=head->next;
head->prev=trav;
trav->next=head;
delete temp;
return(head);
}
struct doublylist* insertfirst(struct doublylist *head)
{
if(head==NULL)
{
head=new doublylist;
cout<<"Enter the no : ";
cin>>head->no;
head->next=head;
head->prev=head;
return (head);
}
struct doublylist *temp;
struct doublylist *trav;
for(trav=head;trav->next!=head;trav=trav->next);
temp=new doublylist;
cout<<"Enter the no : ";
cin>>temp->no;
temp->next=head;
temp->prev=trav;
head->prev=temp;
trav->next=temp;
return(temp);
}
struct doublylist* insertmiddle(struct doublylist *head)
{
struct doublylist *temp;
cout<<"Enter the position : ";
int pos;
cin>>pos;
if(pos==1)
{
head=insertfirst(head);
return(head);
}
int counter=1;
struct doublylist*trav;
for(trav=head;counter!=pos-1&&trav->next!=head;trav=trav->next,counter++);
if(trav->next==head && counter!=pos)
{
cout<<"invalid postion";
return(head);
}
if(trav->next==head && counter==pos)
{
temp=new doublylist;
trav->next=temp;
temp->next=head;
temp->prev=trav;
cout<<"Enter the no : ";
cin>>temp->no;
return(head);
}
temp=new doublylist;
cout<<"Enter the no : ";
cin>>temp->no;
temp->next=trav->next;
temp->prev=trav;
temp->next->prev=temp;
trav->next=temp;
return(head);
}
struct doublylist* deletevalue(struct doublylist*head)
{
cout<<"enter the value to be deleted : ";
int key;
cin>>key;
if(head==NULL)
{
return(NULL);
}
if(head->no==key)
{
head=deletefirst(head);
return(head);
}
struct doublylist *trav;
for(trav=head;trav->next->no!=key&&trav->next!=head;trav=trav->next);
if(trav->next==head)
{
cout<<"search key not found:";
return(head);
}
struct doublylist *temp;
temp=trav->next;
temp->next->prev=trav;
trav->next=temp->next;
delete temp;
return(head);
}
void display(struct doublylist*head)
{
if(head==NULL)
{
cout<<"empty list";
return;
}
struct doublylist *trav;
trav=head;
while(1)
{
cout<<endl<<"The element is : "<<trav->no;
if(trav->next==NULL)
break;
trav=trav->next;
}
}
void reverse(struct doublylist *head)
{
struct doublylist *trav=head,*last;
for(trav=head;trav->next!=NULL;trav=trav->next);
last=trav;
while(1)
{
cout<<endl<<"The element is : "<<trav->no;
if(trav->prev==last)
break;
trav=trav->prev;
}
}
struct doublylist* copy(struct doublylist*head)
{
struct doublylist *trav=head;
struct doublylist *newhead=NULL;
while(1)
{
newhead=append_copy(newhead,trav->no);
if(trav->next==head)
{
break;
}
trav=trav->next;
}
return(newhead);
}
struct doublylist* append_copy(struct doublylist *head,int key)
{
if(head==NULL)
{
head=new doublylist;
head->no=key;
head->next=head;
head->prev=head;
return (head);
}
struct doublylist *trav=NULL,*temp=NULL;
for(trav=head;trav->next!=head;trav=trav->next);
temp=new doublylist;
temp->next=head;
trav->next=temp;
temp->prev=trav;
head->prev=temp;
temp->no=key;
return(head);
}