从自定义链接列表中打印值时,陷入无限循环

时间:2017-12-07 16:05:56

标签: c++ templates

我正在尝试实现一个基本的单链表。在那,我试图从头插入。然后我尝试打印插入的数据。我的代码如下:

 #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循环中并反复打印相同的值。 任何人都可以帮助我陷入困境吗?

3 个答案:

答案 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未初始化为任何内容