C++列表中的分段错误

Segmentation fault in C++ List

本文关键字:分段 错误 列表 C++      更新时间:2023-10-16

我想创建一个自己的List类,每个节点都有一个值(double)。在我向列表中添加了一个节点后,我想获得列表的正确长度(1),但它只是在我的node::getNext()方法中显示"Segmentation Error"。

这是我的代码:

#include <iostream>
#include <cassert>
using namespace std;
class List{
private:
    class Node{
    public:
        Node(double value){
            this->value = value;
            this->setNext(nullptr);
        }
        Node* getNext(){
            return next;
        }
        void setNext(Node* myNode){
            this->next = myNode;
        }
    private:
        double value;
        Node* next;
    };
    Node *head;
public:
    List(){
        head = nullptr;
    }
    int length(){
        int length = 0;
        if (head == nullptr)return length;
        else{
            Node *pointer = head;
            do {
                pointer = pointer->getNext();
                length++;
            } while (pointer->getNext() != nullptr);
        }
        return length;
    }
    void pushback(double value){
        if (head == nullptr)head = new Node(value);
        else{
           lastNode()->setNext(new Node(value));
        }
    }
    Node* lastNode(){
        Node* end = head;
        while(end->getNext() != nullptr){
            end = end->getNext();
        }
        return end;
    }
};
class TestList{
public:
    void run(){
        testListConstructor();
        testAddOneNodeToList();
        //testAddSecondNodeToList();
    }
private:
    void testListConstructor(){
        List myList;
        assert(0 == myList.length());
    }
    void testAddOneNodeToList(){
        List myList;
        myList.pushback(1.5);
        assert(1 == myList.length());
    }
    void testAddSecondNodeToList(){
        List myList;
        myList.pushback(1.5);
        cout << myList.lastNode();
        myList.pushback(2.5);
        assert(2 == myList.length());
    }
};
int main(void){
    TestList tl;
    tl.run();
    cout << "Main-Function abgearbeitet" << endl;
    return 0;
}

getNext方法出错了什么?为什么我会出现分段错误?

由于一直在调用pointer = pointer->getNext(),因此必须检查pointer是否为nullptr,作为do-while子句的条件。

或者只是做一些类似的事情:

len = 0;
curr = head
while (curr != nullptr) {
    ++len;
    curr = curr.next
}

您在这里使用的是nullptr

Node *pointer = head;
do{
    pointer = pointer->getNext(); \ (1)
    length++;
}while (pointer->getNext() != nullptr);

因为当您到达最终列表节点时,(1)之后的pointer的值将为nullptr