将节点附加到链表时出现段错误
Segfault when appending node to linked list
我一直在尝试使用 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;
}
Node.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
的新节点。因为 temp == nullptr
,所以 void SLL<T>::Append
方法中的 else
附加了它。但是,在第二个 Append
上,while 循环 运行 一次,然后在调用 Node
class 的 setter 时崩溃。我不明白为什么会这样。
我期待看到
Hello
World
我是不是太狭隘了?这很愚蠢。对不起,如果它对 SO 来说太基础了...
谢谢,
埃里普
您在 Append
中的 while 循环以 temp
为空指针结束,因此没有 temp->setNext()
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);
我一直在尝试使用 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;
}
Node.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
的新节点。因为 temp == nullptr
,所以 void SLL<T>::Append
方法中的 else
附加了它。但是,在第二个 Append
上,while 循环 运行 一次,然后在调用 Node
class 的 setter 时崩溃。我不明白为什么会这样。
我期待看到
Hello
World
我是不是太狭隘了?这很愚蠢。对不起,如果它对 SO 来说太基础了...
谢谢, 埃里普
您在 Append
中的 while 循环以 temp
为空指针结束,因此没有 temp->setNext()
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);