2017-10-22 75 views
0

我已经写了一个通用的链表验证码:使用C++和通用模板提供分段错误错误的链接列表。

#include <iostream> 
#include <stdio.h> 


template <class T> 
struct Node{ 
    T data; 
    Node<T> *next; 
}; 


template <class T> 
class LinkedList{ 


    Node<T>* head; 
    int size; 

    public: 

     LinkedList<T>() { 

      size = 0; 
      head = NULL; 
     } 


     void ll_push(T data){ 
      Node<T>* new_node; 
      new_node->data = data; 
      new_node->next = head; 
      head = new_node; 
      size ++; 
     } 

     int ll_size(){ 
      return size; 
     } 

     void ll_print_int(){ 
      Node<T> *start = head; 
      while (start != NULL){ 
       cout<< start->data; 
       start = start->next; 
       cout<< ","; 
      } 
     } 


}; 



int main(){ 

    LinkedList<int> ll; 

    for(int i = 0; i < 10; i++){ 
     ll.ll_push(i); 
    } 

    ll.ll_print_int(); 

    return 0; 
} 

但每当我试图执行ll_print,我得到一个分段错误。我想我可能会在某个时候误用指针,但我不确定。我仍然是C++的新手,所以如果有人能解释我做错了什么,我会非常感激。

+0

谢谢,但这并不能解决问题 – Robot0110

+0

任何自我尊重编译器会由于这种常见的编程错误而发出诊断消息,而且编译器很可能会这样做,但是由于它确实生成了编译的程序,因此您会忽略它。那么,你刚刚学到了一个非常宝贵的教训:即使它成功地编译了一个编译好的程序,也不要忽略来自编译器的警告和其他诊断信息。编译器向你咆哮的原因有很多,这不是因为你的编译器喜欢生成长而混乱的消息。 –

+0

@ Robot0110 *我仍然是C++的新手* - 但是您正在尝试编写一个程序,只有中级到高级程序员才能正确编写**,甚至一位中级程序员可能会错过一些重要细节。 – PaulMcKenzie

回答

1

但是,每当我尝试执行ll_print,我得到一个分段错误错误。

您在这里使用unintialized指针:

Node<T>* new_node;  // unintialized pointer. 
new_node->data = data; 

最有可能你想:

Node<T>* new_node = new Node<T>; 
new_node = ... 
+0

感谢您的回复,但这并不能解决问题。 – Robot0110

+0

@ Robot0110是的,它*确实*。你重建你的程序了吗? –

+0

它不能解决问题,因为问题中显示的代码不是真实代码,而是幻想代码,因为它显示错误,所以它无法编译。谁知道原始代码实际读取的内容。它可能有其他类似的错误。 –