【问题标题】:Program is crashing from creating push function for Linked List程序因为链接列表创建推送功能而崩溃
【发布时间】:2018-08-02 15:30:58
【问题描述】:

我正在尝试使用链接列表来实现堆栈。我的程序不断崩溃,当尝试打印新的链接列表时,它会打印一个无符号整数。我的打印功能很好,所以下面是这个功能。

请帮忙。

void LinkedList::Push (int val)
{
    Node* newHead = new Node;
    Node* oldHead = new Node;
    newHead->value = val;
    oldHead = head;
    head = newHead;
    oldHead->prev = head;
    head->next = oldHead;
    delete newHead;
}

【问题讨论】:

  • 什么是head?无论如何,你有内存泄漏,因为oldHead 永远不会得到deleted
  • 确实知道std::stack已经存在,对吧?
  • @JesperJuhl 我认为 OP 正在尝试实现链表,而不是堆栈。但我猜这无论如何都是一项家庭作业,所以这就是他们“重新发明轮子”的原因。
  • 我假设您正在尝试 push_front: new_node->next = head; head = new_node;
  • 你有内存泄漏:oldHead = head;。顺便说一句,您无需分配对象即可使用指针。

标签: c++ linked-list stack


【解决方案1】:

一个问题是您在oldHead 的定义中newed 的Node 永远不是deleted。由于您在创建后立即将oldHead 设置为head,因此我建议您将其作为您的定义:

Node* oldHead = head;

不过,主要问题是你 delete newHead,现在 head 指向的就是这个问题。因此,当你去打印head时,你正在读取无效数据。

我强烈建议将资源处理留给 std::shared_ptr 之类的对象,而不是 newing 和 deleteing 自己。

【讨论】:

    【解决方案2】:

    我不确定我是否理解你的问题。

    你的固定方法:

    void Push( const int val )
    {
      Node* newNode { new Node };
      newNode->value = val;
      newNode->next = head;
      head = newNode;
    }
    

    阅读更多关于链表操作的信息here。您不需要双向链表来实现堆栈 - 您只需要在一端推送/弹出。

    [编辑]

    我没有注意到您使用的是双向链表(这就是需要完整/可验证示例的原因)。正如我所说,对于堆栈实现,单链表就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2014-05-04
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      相关资源
      最近更新 更多