如何获得下一个节点的值?它总是返回最后一个节点

问题描述

class Node{
    private:
        int value;
        Node *next;
    public:
        Node(int aValue){
            value = aValue;
            cout<< "Node created: " << value <<endl;
        }
        void setValue(int newValue){
            value = newValue;
        }
        int getValue(){
            return value;
        }
        void setNext(Node node){
            next = &node;
        }
        Node nextNode(){
            return *next;
        }
};

int main (){
    Node nodeA(29);
    Node nodeB(3);
    Node nodeC(56);
    Node nodeD(72);
    Node nodeE(69);

    nodeA.setNext(nodeB);
    nodeB.setNext(nodeC);
    nodeC.setNext(nodeD);
    nodeD.setNext(nodeE);

    cout<< nodeA.nextNode().getValue();
}

解决方法

链接列表方法应使用 pointers 。查看您的setNext

版本
    void setNext(Node node){
        next = &node;
    }

如您所见,这存储了node参数的地址,这与main中的node对象的地址不同。而且由于setNext方法退出后,节点参数不再存在,因此您最终存储了无效的地址。

改为尝试

    void setNext(Node* node){
        next = node;
    }
    Node* nextNode(){
        return next;
    }

int main()
{
    ...
    nodeA.setNext(&nodeB);
    nodeB.setNext(&nodeC);
    nodeC.setNext(&nodeD);
    nodeD.setNext(&nodeE);

    cout<< nodeA.nextNode()->getValue(); 
}
,

您的代码具有未定义的行为。

    void setNext(Node node){
        next = &node;
    }

您存储本地node的地址。一旦此函数返回node不再存在,并且next是一个悬空指针。稍后在nextNode中取消引用无效指针将导致未定义的行为。

,

设置“下一个”后,您在哪里更新值?

做什么

void setNext(Node* node){
    next = node;
    value = node->value;
}


int getValue(){
    return next->value;
}