c++ - 为什么我的链表复制构造函数总是出现段错误?

标签 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;
}

最佳答案

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

if(headPtr == NULL)

headPtr还没有初始化,所以我们不知道会发生什么。它很可能会具有某种不会是 NULL 的值(value)。如果是,那么你的 headPtr在您的拷贝中永远不会被设置。

关于c++ - 为什么我的链表复制构造函数总是出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36506080/

相关文章:

c++ - QLibrary:如何从一个.so文件创建两个实例?

c++ - 在for循环中声明和初始化变量

c++ - MapViewOfFile 是否有可能两次返回相同的地址?

java - gradle 中的原生依赖

c++ - dispatch_queue_t 作为 C++ 类中的实例变量

c++ - 错误: “Left of getValue must have class/struct/union”

c++ - 如何从WAV文件中获取采样率?

c++ - 在方法 C/C++ 中释放动态分配的 char*

c++ - CUDA 内核可以是虚函数吗?

c++ - 从指针的 QList 中移除元素