我有很多以前使用Java链接列表的经验,但我似乎对这种在C++中的简单尝试感到困惑.我在运行时遇到了分段错误,根据我的理解,它与分配空指针有关,但我对解决方案感到茫然.
编辑:谢谢大家的回复.代码现在正在运行,但试图使用
delete p;在linkedList :: addNode的末尾导致运行时的分段错误.只是好奇,如果有人知道为什么会这样?
这是我更新的代码:
#include <iostream>
using namespace std;
class Node{
public:
int data;
Node * next;
Node(int x){
data = x;
next = NULL;
}
Node(int x, Node * y){
data = x;
next = y;
}
};
class linkedList{
Node *head;
public:
linkedList(){
head = NULL;
}
void addNode(int value){
Node *p;
if(head == NULL)
head = new Node (value, NULL);
else{
p=head;
while(p->next !=NULL)
p=p->next;
p->next = new Node (value, NULL);
}
}
void print(){
Node * p;
p = head;
while(p != NULL){
cout << p->data << "\n";
p = p->next;
}
}
};
int main(void){
linkedList test;
test.addNode(4);
test.addNode(76);
test.addNode(12);
test.print();
return(0);
}
Run Code Online (Sandbox Code Playgroud)
首先,在linkedList::addNode方法,你有建设if (head = NULL),这将拉闸分配到head; 你想要==运营商.
二,关于线:
head = &(Node (value, NULL));
Run Code Online (Sandbox Code Playgroud)
出于某种不直观的原因,这是行不通的.您将获得对a的引用Node,但是一旦该方法结束,该节点将超出范围,并且尝试引用它将导致分段错误.您需要使用new运算符(与其他类似的行相同):
head = new Node(value, NULL);
Run Code Online (Sandbox Code Playgroud)
如果添加一个删除节点的方法,请确保delete该节点 - 它不会像在Java中一样自动进行垃圾收集.
补充工具栏:想想会发生什么:当你这样做时
Node(value, NULL),你正在使用一个像这样声明的临时变量:Run Code Online (Sandbox Code Playgroud)Node hiddenTempNode(value, NULL);这不会为除了堆栈之外的任何地方的对象分配空间 - 它非常类似于为堆栈上的
inta和a 分配空间Node *作为单独的变量.因此,只要您离开方法,对象就会消失,指向它的指针在使用时会发生奇怪的事情.
第三,要注意:您可能希望next = NULL在单参数构造函数中设置,以确保它始终具有值.同样适用于您的默认构造函数.
第四:你的linkedList::print方法循环,直到p->next是NULL与印刷的价值p->next; 如果你想得到第一个和最后一个项目,那么这些事件p->next应该被改为p.
对于初学者
if(head = NULL)
Run Code Online (Sandbox Code Playgroud)
是一个赋值,而不是检查是否相等。将其更改为
if(head == NULL)
Run Code Online (Sandbox Code Playgroud)
第二,
head = &(Node (value, NULL));
Run Code Online (Sandbox Code Playgroud)
没有意义*将其更改为
head = new Node (value, NULL);
Run Code Online (Sandbox Code Playgroud)
*这实际上创建了一个临时对象,为您提供地址,然后销毁该新创建的对象。
第三,
Node(int x) { data = x; }
Run Code Online (Sandbox Code Playgroud)
不留next任何值,将此行更改为
Node(int x) { data = x; next = NULL; }
Run Code Online (Sandbox Code Playgroud)