复制双向链表的构造函数(c ++)

时间:2016-03-17 03:37:24

标签: c++ copy-constructor doubly-linked-list

我在为双向链表实现复制构造函数时遇到了麻烦。我的教授为DLL类提供了一个框架,我正在将这些函数作为项目的一部分来实现。我在网上看到的所有内容都没有被证明是有用的,因为我看到的一切看起来与我应该使用的代码格式完全不同。

对于初学者来说这是DLL.h文件

#include <string>
using namespace std;

struct Node{
    string ssn;
    string name;
    Node* succ;
    Node* pred;
};

class DLL{
    private:
        Node* headPtr;
        int itemCount;

    public:
        DLL();
        DLL(DLL& n); //Copy constructor
        virtual ~DLL();
        Node* getHeadPtr();
        int search(string ss) const;
        bool insert(string ss, string name, int & count);
        bool remove(string ss, int & count);
        int size();
        void display();
};

除了析构函数之外我还实现了所有其他函数,我还没有使用过,但到目前为止这是我的复制构造函数的代码:

DLL::DLL(DLL& n){
    n.headPtr = nullptr;
    n.itemCount = 0;

    Node* temp = headPtr;
    while(temp!= NULL){
        temp = temp->succ;
        insert(temp->ssn, temp->name, n.itemCount);
    }   
}

当我运行这个时,我会继续得到段错误。我已经在互联网上搜索了一段时间,但是没有类似于我理解的格式了。

非常感谢所有帮助/建议/建议,谢谢!

编辑:所以现在我有了这个,它在技术上有效,但要求是内存地址不同。我提供了一个文件test.cpp,它运行带有示例参数的函数,最后运行就像是原始列表:12,13,14(带内存地址),然后是新复制的。

在我获得segfault 11之前,但现在它运行但是在相同的内存地址。

DLL::DLL(DLL& n){

Node* temp = n.headPtr;
headPtr = temp;
int count = 0;

while(temp != NULL){
    insert(temp->ssn, temp->name, count);
    temp = temp->succ;
}   

}

1 个答案:

答案 0 :(得分:0)

你在复制构造函数中做的第一件事是破坏原始列表。 n是您从复制的列表,通常不应修改,这就是为什么通常复制构造函数将const Type&作为输入参数。

你必须做类似

的事情
DLL::DLL(DLL& n) {
    int i = 0
    Node* temp = n.headPtr;
    while(temp != NULL){
        temp = temp->succ;
        insert(temp->ssn, temp->name, i++);
    }   
}