C++数据结构路程:第二章二阶段,双向链表

 主要与单链表的区别在插入和删除,其优点在我这个简单增删改查中还不体现,用双向肯定可以降低时间复杂度

运行良好

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值