Doubly Linked List program with all the
operations:
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
template<class T>
class node
{
node<T> *llink;
T data;
node<T> *rlink;
friend class dll<T>;
};
template <class T>
class dll
{
private:
node<T> *l,*r;
public:
dll();
~dll();
int isempty();
void display();
int length();
void insert(int i, T x);
int del(int i);
T find(int i);
node<T>* search(T x);
void erase();
void append(node<T>*k);
void create();
};
template<class T>
dll<T>::dll()
{
l=r=NULL;
}
template<class T>
int dll<T>::isempty()
{
return(l==NULL);
}
template<class T>
void dll<T>::display()
{
node<T> *p;
if(isempty())
{
cout<<"DLL is empty\n";
}
else
{
cout<<"DLL is as follows\n";
for(p=l;p!=NULL;p=p->rlink)
cout<<p->llink<<"\t"<<p->data<<"\t"<<p->rlink<<"\n";
}
}
//length()
template<class T>
int dll<T>::length()
{
int ctr=0;
node<T> *p;
p=l;
while(p!=NULL)
{
ctr++;
p=p->rlink;
}
return(ctr);
}
//find()
template<class T>
T dll<T>::find(int i)
{
node<T> *p;
if(i<1||i>length())
return(-1);
p=l;
for(int j=1;j<=i-1;j++)
p=p->rlink;
return(p->data);
}
//search()
template<class T>
node<T>* dll<T>::search(T x)
{
node<T> *p;
p=l;
while(p!=NULL)
{
if(p->data==x)
return(p);
}
return(NULL);
}
//apend()
template <class T>
void dll<T>::append(node<T>* k)
{
node<T> *last;
k->rlink=NULL;
if(isempty())
l=r=k;
else
{
last=l;
while(last->rlink!=NULL)
{
last=last->rlink;
}
last->rlink=k;
r=last;
}
}
//create()
template<class T>
void dll<T>::create()
{
T x;
node<T> *k;
l=r=NULL;
cout<<"enter values terminated by -1 or !\n";
cin>>x;
while(x!=-1&&x!='!')
{
k=new node<T>;
k->data=x;
append(k);
cin>>x;
r=r->link;
}
}//create()
//insert()
template<class T>
void dll<T>::insert(int i,T x)
{
node<T> *temp,*p,*next;
if(i<0||i>length())
cout<<"Non existing node\n";
else
{
p=new node<T>;
p->data=x;
if(isempty())
{
l=r=p;
p->llink=p->rlink=NULL;
}
else if(i==0)
{
l->llink=p;
p->rlink=l;
p->llink=NULL;
l=p;
}
else if(i==length())
{
p->rlink=NULL;
p->llink=r;
r->rlink=p;
r=p;
}
else
{
temp=l;
for(int j=1;j<=i-1;j++)
temp=temp->rlink;
next=temp->rlink;
p->llink=temp;
p->rlink=next;
next->llink=p;
}
}
}
//erase()
template<class T>
void dll<T>::erase()
{
node<T>*p;
while(!isempty())
{
p=l;
l=l->rlink;
delete p;
}
r=NULL;
}
template<class T>
dll<T>::~dll()
{
erase();
}
//dele()
template <class T>
T dll<T>::del(int i)
{
node<T>*p,*prev,*next;
T x;
if(i<1||i>length())
return(-1);
else if(l==r)
{
p=l;
l=r=NULL;
x=p->data;
delete p;
return(x);
}
else if(i==1)
{
p=l;
l=l->rlink;
l->llink=NULL;
x=p->data;
delete p;
return(x);
}
else if(i==length())
{
p=r;
r=r->llink;
r->rlink=NULL;
x=p->data;
delete p;
return(x);
}
else
{
p=l;
for(int j=1;j<=i-1;j++)
p=p->rlink;
prev=p->llink;
next=p->rlink;
prev->rlink=next;
next->llink=prev;
x=p->data;
delete p;
return(x);
}
}
//menu()
void menu()
{
cout<<"1. insert a node after ith node\n";
cout<<"2. delete ith node\n";
cout<<"3. display DLL\n";
cout<<"4. length of DLL\n";
cout<<"5. data of ith node in DLL\n";
cout<<"6. search for a value in DLL\n";
cout<<"7. erase DLL\n";
cout<<"8. exit\n";
}
main()
{
dll<int>a;
node<int>*p;
int ch,i,x;
clrscr();
a.create();
menu();
cout<<"enter ur choice\n";
cin>>ch;
while(ch<8)
{
switch(ch)
{
case 1:{
cout<<"enter value of i( 0 to insert ar the beginning)\n";
cin>>i;
cout<<"enter value of new node\n";
cin>>x;
a.insert(i,x);
break;
}
case 2:{
cout<<"enter value of i\n";
cin>>i;
x=a.del(i);
if(x==-1)
cout<<"Non-existing node\n";
else
cout<<"data of deleted node is"<<x<<"\n";
break;
}
case 3:{
a.display();
break;
}
case 4:{
cout<<"no.of nodes ="<<a.length()<<"\n";
break;
}
case 5:{
cout<<"enter value of i\n";
cin>>i;
x=a.find(i);
if(x==-1)
cout<<"non existing node\n";
else
cout<<"data of desired node is"<<x<<"\n";
break;
}
case 6:{
cout<<"enter value to be searched\n";
cin>>x;
p=a.search(x);
if(p==NULL)
cout<<"It is not found\n";
else
cout<<"it is found at address="<<p<<"\n";
break;
}
case 7:{
a.erase();
a.display();
break;
}
}//switch
menu();
cout<<"enter ur choice\n";
cin>>ch;
}//while
getch();
return(0);
}//main()
Doubly Linked List Operations
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
template<class T>
class node
{
node<T> *llink;
T data;
node<T> *rlink;
friend class dll<T>;
};
template <class T>
class dll
{
private:
node<T> *l,*r;
public:
dll();
~dll();
int isempty();
void display();
int length();
void insert(int i, T x);
int del(int i);
T find(int i);
node<T>* search(T x);
void erase();
void append(node<T>*k);
void create();
};
template<class T>
dll<T>::dll()
{
l=r=NULL;
}
template<class T>
int dll<T>::isempty()
{
return(l==NULL);
}
template<class T>
void dll<T>::display()
{
node<T> *p;
if(isempty())
{
cout<<"DLL is empty\n";
}
else
{
cout<<"DLL is as follows\n";
for(p=l;p!=NULL;p=p->rlink)
cout<<p->llink<<"\t"<<p->data<<"\t"<<p->rlink<<"\n";
}
}
//length()
template<class T>
int dll<T>::length()
{
int ctr=0;
node<T> *p;
p=l;
while(p!=NULL)
{
ctr++;
p=p->rlink;
}
return(ctr);
}
//find()
template<class T>
T dll<T>::find(int i)
{
node<T> *p;
if(i<1||i>length())
return(-1);
p=l;
for(int j=1;j<=i-1;j++)
p=p->rlink;
return(p->data);
}
//search()
template<class T>
node<T>* dll<T>::search(T x)
{
node<T> *p;
p=l;
while(p!=NULL)
{
if(p->data==x)
return(p);
}
return(NULL);
}
//apend()
template <class T>
void dll<T>::append(node<T>* k)
{
node<T> *last;
k->rlink=NULL;
if(isempty())
l=r=k;
else
{
last=l;
while(last->rlink!=NULL)
{
last=last->rlink;
}
last->rlink=k;
r=last;
}
}
//create()
template<class T>
void dll<T>::create()
{
T x;
node<T> *k;
l=r=NULL;
cout<<"enter values terminated by -1 or !\n";
cin>>x;
while(x!=-1&&x!='!')
{
k=new node<T>;
k->data=x;
append(k);
cin>>x;
r=r->link;
}
}//create()
//insert()
template<class T>
void dll<T>::insert(int i,T x)
{
node<T> *temp,*p,*next;
if(i<0||i>length())
cout<<"Non existing node\n";
else
{
p=new node<T>;
p->data=x;
if(isempty())
{
l=r=p;
p->llink=p->rlink=NULL;
}
else if(i==0)
{
l->llink=p;
p->rlink=l;
p->llink=NULL;
l=p;
}
else if(i==length())
{
p->rlink=NULL;
p->llink=r;
r->rlink=p;
r=p;
}
else
{
temp=l;
for(int j=1;j<=i-1;j++)
temp=temp->rlink;
next=temp->rlink;
p->llink=temp;
p->rlink=next;
next->llink=p;
}
}
}
//erase()
template<class T>
void dll<T>::erase()
{
node<T>*p;
while(!isempty())
{
p=l;
l=l->rlink;
delete p;
}
r=NULL;
}
template<class T>
dll<T>::~dll()
{
erase();
}
//dele()
template <class T>
T dll<T>::del(int i)
{
node<T>*p,*prev,*next;
T x;
if(i<1||i>length())
return(-1);
else if(l==r)
{
p=l;
l=r=NULL;
x=p->data;
delete p;
return(x);
}
else if(i==1)
{
p=l;
l=l->rlink;
l->llink=NULL;
x=p->data;
delete p;
return(x);
}
else if(i==length())
{
p=r;
r=r->llink;
r->rlink=NULL;
x=p->data;
delete p;
return(x);
}
else
{
p=l;
for(int j=1;j<=i-1;j++)
p=p->rlink;
prev=p->llink;
next=p->rlink;
prev->rlink=next;
next->llink=prev;
x=p->data;
delete p;
return(x);
}
}
//menu()
void menu()
{
cout<<"1. insert a node after ith node\n";
cout<<"2. delete ith node\n";
cout<<"3. display DLL\n";
cout<<"4. length of DLL\n";
cout<<"5. data of ith node in DLL\n";
cout<<"6. search for a value in DLL\n";
cout<<"7. erase DLL\n";
cout<<"8. exit\n";
}
main()
{
dll<int>a;
node<int>*p;
int ch,i,x;
clrscr();
a.create();
menu();
cout<<"enter ur choice\n";
cin>>ch;
while(ch<8)
{
switch(ch)
{
case 1:{
cout<<"enter value of i( 0 to insert ar the beginning)\n";
cin>>i;
cout<<"enter value of new node\n";
cin>>x;
a.insert(i,x);
break;
}
case 2:{
cout<<"enter value of i\n";
cin>>i;
x=a.del(i);
if(x==-1)
cout<<"Non-existing node\n";
else
cout<<"data of deleted node is"<<x<<"\n";
break;
}
case 3:{
a.display();
break;
}
case 4:{
cout<<"no.of nodes ="<<a.length()<<"\n";
break;
}
case 5:{
cout<<"enter value of i\n";
cin>>i;
x=a.find(i);
if(x==-1)
cout<<"non existing node\n";
else
cout<<"data of desired node is"<<x<<"\n";
break;
}
case 6:{
cout<<"enter value to be searched\n";
cin>>x;
p=a.search(x);
if(p==NULL)
cout<<"It is not found\n";
else
cout<<"it is found at address="<<p<<"\n";
break;
}
case 7:{
a.erase();
a.display();
break;
}
}//switch
menu();
cout<<"enter ur choice\n";
cin>>ch;
}//while
getch();
return(0);
}//main()
Doubly Linked List Operations
Types of Linked list
No comments:
Post a Comment