C++ 打印自定义链表中的值时陷入无限while循环
我正在尝试实现一个基本的单链接列表。在这方面,我试图从头部插入。然后我尝试打印插入的数据。我的代码如下:C++ 打印自定义链表中的值时陷入无限while循环,c++,templates,C++,Templates,我正在尝试实现一个基本的单链接列表。在这方面,我试图从头部插入。然后我尝试打印插入的数据。我的代码如下: #include<iostream> using namespace std; template<class T> class Node { public: T data; Node<T> *next; Node():data(T()),next(NULL) {} }; templ
#include<iostream>
using namespace std;
template<class T>
class Node
{
public:
T data;
Node<T> *next;
Node():data(T()),next(NULL)
{}
};
template<class T>
class SinglyinkedList
{
public:
Node<T> *head;
SinglyinkedList():head(NULL)
{}
void insertFromHead(T data)
{
Node<T> *temp;
temp->data = data;
temp->next = head;
head = temp;
}
void printLinkedist()
{
Node<T> *temp;
temp = head;
while(temp != NULL)
{
cout <<"Hi";
cout << temp->data;
temp = temp->next;
}
}
};
int main()
{
SinglyinkedList<int> list;
list.insertFromHead(10);
list.insertFromHead(20);
list.insertFromHead(30);
list.insertFromHead(40);
list.printLinkedist();
return 0;
}
但当我打印链表时,它只是停留在while循环中,一次又一次地打印相同的值。
有人能帮我解释为什么我被困在循环中吗?您正在尝试使用未初始化的对象
Node<T> *temp;
temp->data = data;
你有这种未定义的行为。
只需使用:
void insertFromHead( T data )
{
Node<T> *temp = new Node<T>();
temp->data = data;
temp->next = head;
head = temp;
}
it将解决您的问题您的问题可能是:
Node<T> *temp;
temp->data = data;
在尝试取消引用temp之前,temp没有初始化为任何值链表代码通常为每个节点使用一次new,而您忘记了使用new。 这意味着您使用的是未初始化的指针,该指针未定义 添加缺少的对象:
void insertFromHead(T data)
{
Node<T> *temp = new Node<T>;
temp->data = data;
temp->next = head;
head = temp;
}
您也可以将其缩短一点:
void insertFromHead(const T& data)
{
head = new Node<T>(data, head);
}
在insertFromHead中,temp->data正在访问一个未初始化的指针,可能会崩溃。@crashmstr,但它应该通过Node类的默认构造函数初始化。Node*temp;是未初始化的指针。节点温度;将是一个默认构造的节点。@crashmstr哦,伙计,你很亲切。感谢u.Worth指出,使用原始指针将需要稍后删除,理想情况下,这将在构造函数中完成;甚至使用智能指针也行。但在我的主要函数中,我以类似的方式实例化了SingleLinkedList。单链接列表;“它在那里工作。”德文德拉维玛,那不是指针。如果您有SingleInkedList*列表;和list->insertFromHead10;你可能会遇到一些问题,但不一定会。我明白了。非常感谢你。
void insertFromHead(const T& data)
{
head = new Node<T>(data, head);
}