首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++链表实现,遍历时进入无限循环。我猜是建造商出了什么问题

C++链表实现,遍历时进入无限循环。我猜是建造商出了什么问题
EN

Stack Overflow用户
提问于 2021-05-07 02:05:27
回答 2查看 60关注 0票数 0

我是C++的新手。我正在尝试实现一个链表。调用遍历函数时,输出进入无限循环(输出显示在底部)。当我在insertNodeAtEnd函数中使用'new‘而不是构造器时没有错误,但我读到在C++中这通常不是一个好的做法,最好习惯使用构造器。我做错了什么?

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>

struct Node
{
    int data;
    Node *next;
    Node(int data)
    {
        this->data = data;
        this->next = NULL;
    }

    ~Node() {}
};

class LinkedList
{
  public:
    LinkedList()
    {
        std::cout << "Linked list created \n";
    }

    static Node *head;
    static Node *tail;
    static int numberOfNodes;

    static int getNumberOfNodes()
    {
        return numberOfNodes;
    }

    static void insertNodeAtEnd(int data)
    {
        Node newNode(data);
        if (head == NULL)
        {
            head = tail = &newNode;
            return;
        }

        tail->next = &newNode;
        tail = &newNode;
        numberOfNodes++;
        return;
    }

    static void traverse()
    {
        if (numberOfNodes == 0)
        {
            std::cout << "Linked list is empty \n";
        }
        Node *curr = head;
        while (curr != NULL)
        {
            std::cout << curr->data << std::endl;
            curr = curr->next;
        }
        return;
    }

    ~LinkedList()
    {
        std::cout << "Linked list destroyed \n";
    }
};

Node *LinkedList::head = NULL;
Node *LinkedList::tail = NULL;
int LinkedList::numberOfNodes = 0;

int main()
{
    LinkedList linkedlist;
    linkedlist.insertNodeAtEnd(40);
    linkedlist.insertNodeAtEnd(50);
    linkedlist.insertNodeAtEnd(60);
    linkedlist.insertNodeAtEnd(70);
    linkedlist.traverse();
}

这是输出。(无限循环,必须在控制台中终止。)

代码语言:javascript
代码运行次数:0
运行
复制
Linked list created 
70
70
70
70
70
70
70
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-07 02:12:03

这里:

代码语言:javascript
代码运行次数:0
运行
复制
static void insertNodeAtEnd(int data)
{
    Node newNode(data);
    if (head == NULL)
    {
        head = tail = &newNode;
        return;
    }

    tail->next = &newNode;
    tail = &newNode;
    numberOfNodes++;
    return;
}

newNode是一个函数局部变量。当函数返回时,它的生命周期就结束了。你存储的指针是悬空的。当您稍后取消对它们的引用时,您将调用未定义的行为。

要动态分配节点,使其持久化,您可以这样做

代码语言:javascript
代码运行次数:0
运行
复制
Node* newNode = new Node(data);

目前还不清楚为什么LinkedList的所有成员都被声明为static。其效果基本上是您只能有一个链表,因为第二个链表将共享所有成员。

票数 1
EN

Stack Overflow用户

发布于 2021-05-07 02:15:55

我通过创建一个新的Node而不是直接实例化一个来让它工作。在您的版本中发生的情况是,创建的节点被销毁,而通过创建新的节点,它将保持有效,直到显式删除

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>

struct Node
{
    int data;
    Node *next;
    Node(int data)
    {
        this->data = data;
        this->next = NULL;
    }

    ~Node() {}
};

class LinkedList
{
  public:
    LinkedList()
    {
        std::cout << "Linked list created \n";
    }

    static Node *head;
    static Node *tail;
    static int numberOfNodes;

    static int getNumberOfNodes()
    {
        return numberOfNodes;
    }

    static void insertNodeAtEnd(int data)
    {
        Node* newNode = new Node(data);
        if (head == NULL)
        {
            head = tail = newNode;
            return;
        }

        tail->next = newNode;
        tail = newNode;
        numberOfNodes++;
        return;
    }

    static void traverse()
    {
        if (numberOfNodes == 0)
        {
            std::cout << "Linked list is empty \n";
        }
        Node *curr = head;
        while (curr != NULL)
        {
            std::cout << curr->data << std::endl;
            curr = curr->next;
        }
        return;
    }

    ~LinkedList()
    {
        std::cout << "Linked list destroyed \n";
    }
};

Node *LinkedList::head = NULL;
Node *LinkedList::tail = NULL;
int LinkedList::numberOfNodes = 0;

int main()
{
    LinkedList linkedlist;
    linkedlist.insertNodeAtEnd(40);
    linkedlist.insertNodeAtEnd(50);
    linkedlist.insertNodeAtEnd(60);
    linkedlist.insertNodeAtEnd(70);
    linkedlist.traverse();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67423722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档