每次一到prev的地方就显示发生冲突,无法再执行,这是为什么啊??
但是把prev一去掉就好了
这是我的头文件
#include<iostream>
#ifndef DLIST
#define DLIST
using namespace std;
typedef int ElementType;
class DList
{
private:
class Node
{
public:
ElementType data;
Node *prev;//前驱
Node *next;//后驱
Node()
:next(NULL),prev(NULL)
{}
Node(ElementType dataValue,Node *Prev=NULL,Node *Next=NULL)
:data(dataValue),next(Next),prev(Prev)
{}
};
typedef Node *NodePointer;
public:
DList();//构造函数
DList(const DList & origList);//复制构造函数
~DList();//析构函数
const DList & operator=(const DList & rightSide);//赋值运算符
bool DList::empty();//判空
void insert(ElementType dataVal,int index);//插入函数
void erase(int index);//删除函数
int search(ElementType datVal);//查找函数
void display(ostream & out);//遍历
private:
NodePointer first;//第一个节点
NodePointer last;//最后一个节点
int mySize;
};
ostream & operator<<(ostream & out,DList & aList);//输出操作符
#endif
这是CPP文件
#include"DList.h"
#include<iostream>
using namespace std;
//构造函数定义
DList::DList()
:first(NULL),last(NULL),mySize(0)
{}
//复制构造函数的定义
DList::DList(const DList & origList)
{
mySize=origList.mySize;
if(mySize==0)
return;
DList::NodePointer origPtr,lastPtr;
first=new Node(origList.first->data);//复制第一个节点
lastPtr=first;
origPtr=origList.first->next;
//每次一到有prev的地方就无法执行了
origPtr->prev=lastPtr;
while(origPtr!=0)
{
lastPtr->next=new Node(origPtr->data);
origPtr=origPtr->next;
lastPtr=lastPtr->next;
//每次一到有prev的地方就无法执行了
origPtr->prev=lastPtr;
}
last=origPtr;
}
//析构函数的定义
DList::~DList()
{
DList::NodePointer pre=first,ptr;
if(!empty())
{
for(int i=1;i<mySize;i++)
{
ptr=pre->next;
delete pre;
pre=ptr;
}
}
}
//判空的定义
bool DList::empty()
{
return mySize==0?true:false;
}
//赋值运算符的定义
const DList & DList::operator=(const DList & rightSide)
{
mySize=rightSide.mySize;
if(mySize==0)
return *this;
if(this != &rightSide)
{
this->~DList();
first=NULL;
last=NULL;
DList::NodePointer origPtr,lastPtr;
first=new Node(rightSide.first->data);//复制第一个节点
lastPtr=first;
origPtr=rightSide.first->next;
//每次一到有prev的地方就无法执行了
origPtr->prev=lastPtr;
while(origPtr!=0)
{
lastPtr->next=new Node(origPtr->data);
origPtr=origPtr->next;
lastPtr=lastPtr->next;
}
last=origPtr;
}
return *this;
}
//插入函数的定义
void DList::insert(ElementType dataVal,int index)
{
if(index<0||index>mySize)
{
cerr<<"越界!"<<index<<endl;
return;
}
mySize++;
DList::NodePointer newPtr=new Node(dataVal),predPtr=first;
if(index==0)
{
newPtr->next=first;
first=newPtr;
first->next->prev=newPtr;
}
else if(index==mySize)
{
last->next=newPtr;
//每次一到有prev的地方就无法执行了
newPtr->prev=last;
last=newPtr;
}
else
{
for(int i=1;i<index;i++)
predPtr=predPtr->next;
newPtr->next=predPtr->next;
//每次一到有prev的地方就无法执行了
newPtr->prev=predPtr;
predPtr->next->prev=newPtr;
predPtr->next=newPtr;
}
}
//删除函数的定义
void DList::erase(int index)
{
if(index<0||index>=mySize)
{
cerr<<"越界!"<<index<<endl;
return;
}
mySize--;
DList::NodePointer ptr,predPtr=first;
if(index==0)
{
ptr=first;
first=first->next;
//每次一到有prev的地方就无法执行了
first->prev=NULL;
delete ptr;
}
else if(index==mySize)
{
ptr=last;
//每次一到有prev的地方就无法执行了
last=last->prev;
last->next=NULL;
delete ptr;
}
else
{
for(int i=1;i<index;i++)
predPtr=predPtr->next;
ptr=predPtr->next;
predPtr->next=ptr->next;
//每次一到有prev的地方就无法执行了
ptr->next->prev=predPtr;
delete ptr;
}
}
//输出操作符的定义
ostream&operator<<(ostream&out,DList & aList)
{
aList.display(out);
return out;
}
//遍历的定义
void DList::display(ostream & out)
{
DList::NodePointer ptr=first;
cout<<"正序遍历链表:"<<endl;
while(ptr!=NULL)
{
cout<<ptr->data<<" ";
ptr=ptr->next;
}
cout<<endl;
cout<<"反序遍历链表:"<<endl;
DList::NodePointer Ptr=last;
while(ptr!=NULL)
{
cout<<Ptr->data<<" ";
Ptr=Ptr->next;
}
cout<<endl;
}
//查找的定义
int DList::search(ElementType datVal)
{
int pos=1;//从链首开始
DList::NodePointer searchPtr=first;
while(searchPtr!=NULL)
{
if(searchPtr->data==datVal)
cout<<"所查找的数据在第 "<<pos<<" 个节点."<<endl;
searchPtr=searchPtr->next;
pos++;
}
cout<<"无法找到数据!"<<endl;
return -1;
}
int main()
{
cout<<"构建空链表"<<endl;
DList list;
cout<<"判空"<<endl;
cout<<boolalpha<<list.empty()<<endl;
int sum;
cout<<"请输入链表的长度:";
cin>>sum;
for(int i=0;i<sum;i++)
list.insert(i,i);
cout<<"现有链表: "<<list<<endl;
int data,pos;
cout<<"请输入要插入的数: ";
cin>>data;
cout<<"请输入要插入的位置: ";
cin>>pos;
list.insert(data,pos-1);
cout<<"输出链表: "<<endl;
cout<<list<<endl;
int Pos;
cout<<"要删除第几个节点; ";
cin>>Pos;
list.erase(Pos-1);
cout<<list<<endl;
cout<<"赋值"<<endl;
DList mylist;
mylist=list;
cout<<mylist<<endl;
cout<<"复制"<<endl;
DList ch(mylist);
cout<<ch<<endl;
system("pause");
return 0;
}