主要与单链表的区别在插入和删除,其优点在我这个简单增删改查中还不体现,用双向肯定可以降低时间复杂度
运行良好
#include "stdafx.h"
#include<iostream>
using namespace std;
class Node
{
private:
int data;
Node*pprior;
Node*pnext;
friend class doublelist;
public:
Node();
Node(int vdata){this->data=vdata;};
~Node();
};
class doublelist
{
private:
Node*phead;
public:
doublelist();
~doublelist();
void clear();
int Length();
Node*Find1(int n);
Node*Find2(int vdata);
bool Insert(int vdata,int n);
int delet(int n);
void Show();
};
Node::Node()
{
pprior=NULL;
pnext=NULL;
}
Node::~Node()
{
pprior=NULL;
pnext=NULL;
}
doublelist::doublelist()
{
phead=new Node();
//phead->pnext=NULL;
//phead->pprior=NULL;
}
doublelist::~doublelist()
{
clear();
delete phead;
}
void doublelist::clear()
{
Node*pmove=phead->pnext;
Node*pdele;
while(pmove!=NULL)
{
pdele=pmove;
pmove=pdele->pnext;
delete pdele;
}
phead->pnext=NULL;
phead->pprior=NULL;
}
int doublelist::Length()
{
Node*pmove=phead->pnext;
int count=0;
while(pmove!=NULL)
{
pmove=pmove->pnext;
count++;
}
return count;
}
Node*doublelist::Find1(int n)
{
if(n<0)
{
cout<<"this operator is wrong"<<endl;
return 0;
}
Node*pmove;
pmove=phead->pnext;
for(int i=0;i<n;i++)
{
pmove=pmove->pnext;
if(pmove==NULL)
{
cout<<"n is too big!"<<endl;
return NULL;
}
}
return pmove;
}
Node*doublelist::Find2(int vdata)
{
Node*pmove=phead->pnext;
while(pmove->data!=vdata)
{
pmove=pmove->pnext;
if(pmove==NULL)
{
cout<<"there is no data you want"<<endl;
return 0;
}
}
return pmove;
}
bool doublelist::Insert(int vdata,int n)
{
if(n<0)
{
cout<<"you can not do this"<<endl;
return 0;
}
Node*pmove=phead;
for(int i=0;i<n&&!(pmove==NULL);i++)
{
pmove=pmove->pnext;
}
if(pmove==NULL)
{
cout<<"there is no position"<<endl;
return 0;
}
Node*pinsert=new Node(vdata);
pinsert->pnext=pmove->pnext;
if(pmove->pnext)
pmove->pnext->pprior=pinsert;
pinsert->pprior=pmove;
pmove->pnext=pinsert;
return 0;
}
int doublelist::delet(int n)
{
Node*pmove=phead;
if(n<0)
{
cout<<"we can not do this"<<endl;
return 0;
}
for(int i=0;i<n&&pmove->pnext;i++)
{
pmove=pmove->pnext;
}
if(pmove->pnext==NULL)
{
cout<<"can not delete NULL"<<endl;
return 0;
}
Node*pdelete;
pdelete=pmove->pnext;
pdelete->pprior->pnext=pdelete->pnext;
pdelete->pnext->pprior=pdelete->pprior;
int temp=pdelete->data;
delete pdelete;
return temp;
}
void doublelist::Show()
{
Node*pmove=phead->pnext;
while(pmove)
{
cout<<pmove->data;
pmove=pmove->pnext;
}
}
int main(int argc, char* argv[])
{
doublelist list;
for(int i=0;i<10;i++)
{
list.Insert(i*2,i);
}
//list.Show();
//list.clear();
list.Show();
return 0;
}