为什么我的链表的复制构造函数不断出现分段错误?

时间:2016-04-08 17:45:39

标签: c++

此功能是链表的复制结构。代码在第一个while循环中的某个地方中止,它只是在创建新的链表,不确定是什么导致它,并且感谢任何帮助。如果您还有其他需要,也请告诉我。感谢。

DLL::DLL(DLL& n) {
    if (n.headPtr == NULL) {
        headPtr = NULL;
    }
    else {
        //keeps track of the last node in the list                                                        
        Node* lastNode = NULL;
        //keeps track of old list                                                                         
        Node* oldListNode = n.headPtr;

        while (oldListNode != NULL) {
            //create a new Node for new list until reaches end of old list                               
            Node* newNode = new Node;
            newNode->pred = NULL;
            newNode->succ = NULL;
            newNode->ssn = oldListNode->ssn;
            newNode->name = oldListNode->name;
            //add newNode to new List                                                                    
            if (headPtr == NULL) { //new list is empty                                                     
                headPtr = newNode;
                lastNode = headPtr;
            }
            else {
                //adds new node to the end of the list                                                     
                lastNode->succ = newNode;
                newNode->pred = lastNode;
                lastNode = newNode;
            }
            //Goes to the next node in the old list;                                                     
            oldListNode = oldListNode->succ;
        }
    }
    //now puts all information from old list into new list                                              
    itemCount = n.itemCount;
    if (n.headPtr == NULL) {
        headPtr = NULL;
    }
    else {
        if (n.itemCount > 0) {
            cout << "in while loop, ";
            Node *origList = n.headPtr; //pointer accessing old node's data                    
            Node *secondHeadPtr = new Node; //second hptr for new ll                           
            Node *currNode = secondHeadPtr; // points to second ll node that will be filled    
            Node *nextNode; //going to point to added node                                     
            while (currNode != NULL) {
                cout << "in while loop, ";
                nextNode = new Node; //next node, currnode to point to                           
                currNode->ssn = origList->ssn;
                currNode->name = origList->name;
                currNode->succ = nextNode; //create beginning of second ll, next node           
                nextNode->pred = currNode;
                currNode = currNode->succ;
                origList = origList->succ;
                cout << currNode->name << " " << currNode->ssn << " ";
            }
        }
    }
}

标头文件

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

测试文件

#include "DLL.h"
#include <iostream>
#include <string>

using namespace std;

int main() {

    DLL myList;
    int counter = 0;
    int dCounter = 0;

    myList.insert("30", "Jack Eblin", counter);
    myList.insert("40", "Liz Smith", counter);
    myList.insert("10", "Mike Dutter", counter);
    myList.insert("20", "Kitty Lekberg", counter);
    myList.insert("50", "Carma Meshew", counter);

    cout << "After insertion, we should have 10 20 30 40 50 in order" << endl;
    myList.display();

    cout << "Searching 30 in the list, result should be 2" << endl;
    cout << myList.search("30") << endl;

    myList.remove("10", dCounter);
    myList.remove("50", dCounter);

    cout << "After deletion, we should have 20 30 40 in order" << endl;
    myList.display();


    cout << "Testing copy constructor" << endl;
    DLL* temp = new DLL(myList);

    cout << "Contents of the original list" << endl;
    myList.display();

    cout << "Contents of the new list, the memory address of the this list must be different from the\
     original list" << endl;

    if (myList.getHeadPtr() != nullptr) {
        temp->display();
    }
    return 0;
}

1 个答案:

答案 0 :(得分:3)

看起来您从未在复制构造函数中正确设置headPtr。由于我们在复制构造函数中,因此在初始化它们之前不会初始化任何类成员。这意味着headPtr可以是任何东西,除了设置它的值之外什么也不做是未定义的行为。当你到达

if(headPtr == NULL)

headPtr仍然没有初始化,所以我们不知道会发生什么。很可能它会有NULL的某种价值,如果确实如此,那么您副本中的headPtr将永远不会被设置。