【问题标题】:Why my simply linked list doesn't work after first node?为什么我的简单链表在第一个节点之后不起作用?
【发布时间】:2018-12-16 16:02:55
【问题描述】:

我编写此代码以自动获取值并将它们放入链表中,但它只维护第一个并替换第二个节点中的任何新值,并且不会生成第三个、第四个或 ... 节点。

    #include <iostream>

    using namespace std;

    struct node
    {
        int a;
        struct node *next;
    }zero;

    node *first = NULL;


    int main()
    {
        int t;
        for (int i = 0;i < 10;i++)
        {
            node *n = first;
            cin >> t;
            if (first == NULL)
            {
                node temp;
                temp.a = t;
                first = &temp;
                temp.next = NULL;
            }
            else
            {
                while ((*n).next != NULL)
                {
                    n = (*n).next;
                }
                node tt;
                tt.a = t;
                (*n).next = &tt;
                tt.next = NULL;
            }
        }
    }

我插入了 28。 我的第一个节点数据=28。 我插入了57。 我的第二个节点数据 = 57。 我插入了120。 我的 second 节点数据=120。 ...

【问题讨论】:

  • 当您在调试器中启动程序并逐行执行代码时,您观察到了什么?
  • 我知道它会出现在每次代码审查中,但是don't use using namespace std
  • 由于悬空指针的取消引用(由于存储指向局部变量的指针)导致的未定义行为。
  • 存储&amp; 提供的内容以供以后使用通常是个坏主意。这也不例外。网络上到处都是链表的例子,书籍也是如此。
  • 您使用指向局部变量的指针。你永远不会分配新的内存。

标签: c++ linked-list


【解决方案1】:

node temp; 在复合语句中声明一个自动变量。 first = &amp;temp; 分配 first 指向自动变量。

自动变量在作用域结束时自动被销毁 - 在这种情况下是 if 语句的复合子语句。之后,first 不再指向一个有效的对象——它变成了一个悬空指针。

当您在下一次迭代中执行 node *n = first 然后在 else 分支中执行 *n 时,您间接使用了一个悬空指针。程序的行为未定义。

【讨论】:

  • 我没有这个问题(我逐行检查)但我的问题是每次创建第一个节点后临时是一个不会改变的特殊内存空间。
  • @P7928Z 你当然有。在node temp; 行中,您分配内存。在first = &amp;temp; 行中,您存储了该内存的地址。在此之后,内存被释放。在while ((*n).next != NULL) 行中,您取消引用此内存。这是未定义的行为
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 2015-10-19
  • 1970-01-01
  • 2017-06-19
  • 2020-08-29
  • 2014-10-12
相关资源
最近更新 更多