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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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
运行
AI代码解释
复制
Linked list created 
70
70
70
70
70
70
70
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-06 18:12:03

这里:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
Node* newNode = new Node(data);

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

票数 1
EN

Stack Overflow用户

发布于 2021-05-06 18:15:55

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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

复制
相关文章
C++ do while无限循环~
i大于0|| i++,可以无限递增,我也只是刚好看到,写了一个试试,如果你们有更好的,欢迎留言,一起交流!
用户7886150
2021/02/03
2K0
循环链表的实现_建立双向循环链表
  循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环单链表
全栈程序员站长
2022/09/20
7530
循环链表的实现_建立双向循环链表
单循环链表-带头双向循环链表的实现
  虽然名字听上去比较复杂单循环链表,但是实现起来比单链表(全名:不带头、不循环、单向链表)更加简单,也不需要过多考虑特殊情况;
宜轩
2022/12/29
6110
Python 用for循环实现猜数字游戏
Python的语法确实比较优美,都不要{},连标点符号都很少,下面我们用Python来写个猜数字游戏练练手。
py3study
2020/01/06
2.3K0
自定义无限循环ViewPager(三)――ViewPager方法改造实现无限循环
在前面两篇文章中,已经对ViewPager的实现原理有了分析,相信大家对于ViewPager的页面切换也有了一定的了解,接下来就是在ViewPager的基础上对其进行改造,达到无限循环的目的。
用户3106371
2018/09/12
3.6K0
自定义无限循环ViewPager(三)――ViewPager方法改造实现无限循环
无限循环
#!/usr/bin/python # -*- coding: UTF-8 -*- var = 1 while var == 1 : # 该条件永远为true,循环将无限执行下去 num = raw_input("Enter a number :") print "You entered: ", num print "Good bye!"
用户8442333
2021/05/26
1.9K0
用Python实现链表---单向循环链表
运用单向循环链表可以用来解决约瑟夫环问题,但目前通过python来解决此类问题只能停留在最基本的层面上,要想深入解决此类问题,则要通过后续的学习,了解更多的python知识,从来实现对该类问题的完美解决。
算法与编程之美
2023/10/25
1630
用Python实现链表---单向循环链表
jQuery 之 $(this) 出了什么问题?
大家好,又见面了,我是全栈君。 近期在写jQuery的时候出了这样一个问题? <html> <head> <title></title> </head> <style type="text/css"
全栈程序员站长
2022/07/08
5930
python-练习实现猜数字的循环
while:每执行一边,就循环一次并判断条件True或False 为True就继续循环,为False就跳出while循环。
py3study
2020/01/07
6720
c++的链表-C++实现简单链表
  链表是最常用的一种数据结构,无论什么语言,学习数据结构,都绕不开链表,下面通过c++来实现简单链表,所谓简单链表,就是构建链表,然后遍历打印链表。
宜轩
2022/12/26
8570
Python实现单向循环链表
链表是由一个个的节点组成的,在创建链表之前,要先创建节点,然后把节点“串”到链表上。在同一个链表中,每个节点的结构都相同,只是节点中保存的数据不同和引用不同,所以提前声明一个创建节点的类,需要创建节点时实例化即可。
Python碎片公众号
2021/02/26
1K0
Python 实现单向循环链表
循环链表的概念 1.什么是循环链表   所谓的循环链表就是让单向链表的首尾相连,组成一个环状。 2.循环链表的典型应用   约瑟夫环问题。 3.实现循环链表的重点   1,循环链表在插入第一个元素的时候,需要我们将第一元素的指针域指向其自身,也就构成了循环链表。   2,循环链表基于单向链表而生,单是比循环链表多了游标这个概念。要想实现循环链表的插入,删除的关键是考虑头结点问题,因为在头插法方式(往链表的头部插入数据)中,需要将末尾数据元素的指针域指向新插入的节点。将新插入的节点的指针域指向头结点的指针域的
YingJoy_
2018/04/28
1.5K0
python实现双向循环链表
参考https://www.cnblogs.com/symkmk123/p/9693872.html#4080149
未来sky
2018/10/08
6810
python实现双向循环链表
onResume无限循环
查看Log,onResume和onPause在不停的执行,debug排查发现是因为请求权限导致的。
全栈程序员站长
2022/09/05
1.5K0
android画廊无限轮播,ViewPager无限循环实现画廊式banner
主要属性:android:clipChildren=”false” //允许子布局超出父布局显示
全栈程序员站长
2022/08/10
2.3K0
android画廊无限轮播,ViewPager无限循环实现画廊式banner
如何检测链表中是存在循环
  链表在面试中出现的频率很高,有的比较正常,考链表的常规操作,主要看基本功是否扎实,有些就比较难,难在思维的改变和是否能够想到对应的点。这里出现的是其中一个题目,我称之为有环链表问题。也就是从判断一个单链表是否存在循环而扩展衍生的问题。下面来看问题如何解决。   首先来看最基本的这个问题:如何判断一个单链表是否存在循环,链表数目未知。算法不能破坏链表。 思路一:哈希表法 将所有的遍历过的节点用哈希表存储起来,用节点的内存地址作为哈希表的值存储起来。每遍历一个节点,都在这个结构中查找是否遍历过。如果找到有重
陈树义
2018/04/13
2.1K1
点击加载更多

相似问题

循环链表代码进入无限循环

10

我的链表实现出了什么问题?

30

链表无限循环c++

12

这个链表实现出了什么问题?

40

我在链表中进入了一个无限循环。

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文