我正在尝试实现一个基本的单链表。在那,我试图从头插入。然后我尝试打印插入的数据。我的代码如下:
#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循环中并反复打印相同的值。 任何人都可以帮助我陷入困境吗?
答案 0 :(得分:2)
您正在尝试使用未初始化的对象
Node<T> *temp;
temp->data = data;
你有这种未定义的行为。 只需使用:
void insertFromHead( T data )
{
Node<T> *temp = new Node<T>();
temp->data = data;
temp->next = head;
head = temp;
}
它将解决您的问题
答案 1 :(得分:2)
链接列表代码通常包含每个节点new
的一次使用,而您忘记了
这意味着您使用的是未初始化的指针,该指针未定义。
添加缺少的对象:
void insertFromHead(T data)
{
Node<T> *temp = new Node<T>;
temp->data = data;
temp->next = head;
head = temp;
}
如果您将构造函数添加到Node
,
Node(const T& d, Node<T>* n): data(d), next(n) {}
你也可以缩短它:
void insertFromHead(const T& data)
{
head = new Node<T>(data, head);
}
答案 2 :(得分:0)
你的问题可能在这里:
Node<T> *temp;
temp->data = data;
在您尝试取消引用之前,temp未初始化为任何内容