【问题标题】:Segfault when appending node to linked list将节点附加到链表时出现段错误
【发布时间】:2015-05-28 09:34:26
【问题描述】:

我一直在尝试使用 C++ 重写一些基本的数据结构,以刷新我对 OOP 的一些基础知识的记忆,但我已经遇到了一个愚蠢的问题。

我正在尝试构建一个单链表,将字符串“Hello”和“World”附加到列表中,然后查看列表中的所有内容。这是一项非常简单的任务,但是当我运行以下代码时出现分段错误:

driver.cc

#include <iostream>
#include <string>
#include "SinglyLinkedList.h"

int main() 
{
    SLL<std::string> List;
    List.Append("Hello");
    List.Append("World");

    List.visitAll(std::cout);

    return 0;
}

节点.h

#ifndef NODE_H
#define NODE_H

template <class T>
class Node {
    public:
        Node<T>() {} 
        Node<T>(T init) { data = init; next = nullptr; }

        void setData(T newData) { data = newData; }
        void setNext(Node<T> *nextNode) { next = nextNode; }

        const T getData() { return data; }
        Node<T> *getNext() { return next; }
    private:
        T data;
        Node<T> *next;
};

#endif

SinglyLinkedList.h

#ifndef SINGLY_LINKEDLIST_H
#define SINGLY_LINKEDLIST_H

#include "Node.h"
#include <iostream>

template <class T>
class SLL {
    public:
        SLL<T>() { head = nullptr; size = 0; }
        ~SLL<T>() {}
        void Append(T added);
        void Delete(T deleted);
        void visitAll(std::ostream &outs);
    private:
        Node<T> *head;
        long size;
};

template <class T>
void SLL<T>::Append(T added) 
{
    Node<T> *newNode = new Node<T>(added);

    Node<T> *temp = head;

    if(temp != nullptr) {
        while(temp != nullptr) {
            temp = temp->getNext();
        }

        temp->setNext(newNode); // seg fault here
    } 
    else {
        head = newNode;
    }
}

template <class T>
void SLL<T>::visitAll(std::ostream &outs)
{
    Node<T> *temp = head;

    while(temp)
    {
        outs << temp->getData() << std::endl;
        temp=temp->getNext();
    }
}

#endif

只是手动调试,我用data = "Hello"next = nullptr 创建了一个新节点。这在void SLL&lt;T&gt;::Append 方法中由else 附加,因为temp == nullptr。但是,在第二个Append 上,while 循环运行一次,然后在调用Node 类的设置器时崩溃。我不知道为什么会这样。

我期待看到

Hello
World

我是不是太狭隘了?这很愚蠢。对不起,如果它对 SO 来说太基本了......

谢谢, erip

【问题讨论】:

  • 应该是while (temp-&gt;getNext())
  • while(temp != nullptr) 改为while(temp-&gt;getNext() != nullptr)
  • 确实是隧道视觉。很傻。谢谢大家。

标签: c++ segmentation-fault singly-linked-list


【解决方案1】:
while(temp != nullptr) {
    temp = temp->getNext();
}

temp->setNext(newNode); // seg fault here

那是因为当temp == nullptr 时,你正在打破while 循环。

用途:

while(temp->getNext() != nullptr) {
    temp = temp->getNext();
}

temp->setNext(newNode);

【讨论】:

    【解决方案2】:

    Append 中的 while 循环以 temp 作为空指针结束,因此没有 temp-&gt;setNext()

    【讨论】:

      最近更新 更多