代码:
#include <iostream>
using namespace std;
class Node {
public:
Node *next;
int value;
Node(int value) {
this->next = nullptr;
this->value = value;
}
};
class LinkedList {
private:
Node *head;
Node *tail;
public:
LinkedList() {
this->head = nullptr;
this->tail = nullptr;
}
void addToEnd(int value) {
if(head == nullptr)
this->head = new Node(value);
else
this->tail->next = new Node(value);
this->tail = this->tail->next;
}
void print() {
for(Node *n = this->head; n != nullptr; n = n->next)
cout<<n->value<<" ";
cout<<endl;
}
};
int main() {
LinkedList *list = new LinkedList();
list->addToEnd(21);
list->addToEnd(25);
list->addToEnd(56);
list->addToEnd(24);
list->print();
return 0;
}
我的问题是,当我将Node
的实例分配给this->head
时,程序崩溃了。是否有不同的方法将实例分配给最初为nullptr
的指针?
这个代码结构在Java上运行良好,我来自Java,这就是我在C ++指针上遇到困难的原因。
修改
我现在粘贴了正确的代码,我确定。遗憾。
好的,我已经解决了这个问题。因此,问题不在于将对象分配给类成员,而是问题是访问nullptr
成员:this->tail
。
我编辑了这个方法,程序现在以我想要的方式运行。
void addToEnd(int value) {
Node *n = new Node(value);
if(head == nullptr)
this->head = n;
else
this->tail->next = n;
this->tail = n;
}
感谢您的帮助,这个问题现在已经解决了。 :)
答案 0 :(得分:2)
我不知道“崩溃”,但以下行无效:
this->head = Node(value);
head
是指向Node
的指针,但您尝试为其分配Node
。即使这会自动获取您在RHS上创建的临时地址(它没有),您也会指向一个长期不存在的局部变量。
您应该收到编译错误。
您必须使用new
动态创建新对象 - 请务必编写代码以便以后释放该内存!
您同样在main
中搞乱了动态内存分配,在那里您有不必要的内存泄漏。 LinkedList list;
会在那里做得很好。
答案 1 :(得分:0)
您需要为Node
个实例分配内存。最快捷的方法是在new Node(value)
的任何地方致电Node(value)
。但是如果我是你,我会考虑使用shared_ptr<Node>
而不是普通的指针。