我试图建立自己的C++链表实现。我的代码正在编译,但是显然我的指针指向无效的内存地址存在一些问题。

这是我的实现:

#include <iostream>
#include <string>

using namespace std;

class Node
{
    private:
        string _car;
        Node* nextNode;

    public:
        void setCar(string car)
        {
            _car = car;
        }

        string getCar()
        {
            return _car;
        }

        void setNextNode(Node* node)
        {
            nextNode = node;
        }

        Node* getNextNode()
        {
            return nextNode;
        }
};

Node* findLast(Node* node)
{
    Node* nodeOut = NULL;
    while (node->getNextNode() != NULL)
    {
        nodeOut = node->getNextNode();
    }
    return nodeOut;
}

string toString(Node* node)
{
    string output = "";
    while (node->getNextNode() != NULL)
    {
        output += node->getCar() + " ";
        node = node->getNextNode();
    }
    return output;
}

int main()
{
    char xit;
    //ser head node to NULL
    Node* headNode = NULL;

    //create node 1
    Node* node1 = new Node();
    node1->setCar("Mercedes");

    //create node 2
    Node* node2 = new Node();
    node2->setCar("BMW");

    //set node links
    headNode->setNextNode(node1);
    node1->setNextNode(node1);
    node2->setNextNode(node2);

    headNode = node1;

    Node* lastNode = findLast(headNode);

    lastNode->setNextNode(NULL);

    cout << toString(headNode) << endl;

    //pause console
    cin >> xit;
}

最佳答案

您需要重新查看您的代码。

headNode = node1;

在分配实例headNode的任何成员函数之前,应完成此分配。
最初,您已为此指针分配了NULL。
创建node1后,您将设置为无效实例的headNode。这是导致崩溃的原因。
确保有自己的目标,然后尝试在纸上实现一些粗略的工作,并以这种方式制作一些图表,使您可以更清楚地知道要达到的目标。
为什么要setNextNode?我不会理解您想要实现的目标。首先要清楚。

根据我的理解,此代码应按以下方式实现。

#include <iostream>
#include <string>

using namespace std;

class Node
{
    private:
        string _car;
        Node* nextNode;

    public:
        void setCar(string car)
        {
            _car = car;
        }

        string getCar()
        {
            return _car;
        }

        void setNextNode(Node* node)
        {
            nextNode = node;
        }

        Node* getNextNode()
        {
            return nextNode;
        }
};

Node* findLast(Node* node)
{
    Node* nodeOut = node->getNextNode();
    while ( nodeOut->getNextNode()!= NULL)
    {
        nodeOut = nodeOut->getNextNode();
    }
    return nodeOut;
}

string toString(Node* node)
{
    string output = "";
    while (node != NULL)
    {
        output += node->getCar() + " ";
        node = node->getNextNode();
    }
    return output;
}

int main()
{
    char xit;
    //ser head node to NULL
    Node* headNode = NULL;

    //create node 1
    Node* node1 = new Node();
    node1->setCar("Mercedes");
    node1->setNextNode(NULL);//Make null to each next node pointer

    headNode = node1; //assign the node1 as headNode

    //create node 2
    Node* node2 = new Node();
    node2->setCar("BMW");
    node2->setNextNode(NULL);

    //set node links
     node1->setNextNode(node2);




    Node* lastNode = findLast(headNode);

    lastNode->setNextNode(NULL);

    cout << toString(headNode) << endl;

    //pause console
    cin >> xit;
}

希望对使用c++实现链接列表的初学者有用。

09-08 04:06