关于双向链表的问题,小白求指教!!!!

每次一到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;
}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问