Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 打印自定义链表中的值时陷入无限while循环_C++_Templates - Fatal编程技术网

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);
}