2017-12-07 8 views
2

私は基本的な単独リンクリストを実装しようとしています。その中で、私は頭から挿入しようとしています。それから私は挿入されたデータを印刷しようとしました。私のコードは以下の通りです:カスタムリンクリストの値を印刷中に無限ループ中にこだわる

#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ループに入り、同じ値を何度も印刷しています。 誰かが私がなぜループに詰め込まれているのを助けることができますか?あなたが初期化されていないオブジェクトで作業しようとしている

+1

を、 'temp-> data'は初期化されていないポインタにアクセスしており、クラッシュする可能性があります。 – crashmstr

+0

@crashmstrしかし、Node Classのデフォルトのコンストラクタで初期化する必要があります。 –

+1

'Node * temp;'は初期化されていない*ポインタ*です。 'Node temp;'はデフォルトで 'Node 'になります。 – crashmstr

答えて

2

にしようとする前に、

 Node<T> *temp; 
     temp->data = data; 

一時は何にも初期化されていませんリンクリストコードには通常、ノードごとにnewという1つの使用が含まれており、あなたはあなたを忘れてしまいます。
これは、未定義の未初期化ポインタを使用していたことを意味します。

欠落しているオブジェクトの追加:Nodeにコンストラクタを追加する場合は、あまりにも、それを少し短くすることができ、

Node(const T& d, Node<T>* n): data(d), next(n) {} 

void insertFromHead(T data) 
{ 
    Node<T> *temp = new Node<T>; 
    temp->data = data; 
    temp->next = head; 
    head = temp; 
} 

を:insertFromHead` `で

void insertFromHead(const T& data) 
{ 
    head = new Node<T>(data, head); 
} 
+0

を使っても動作します。しかし、私の主な機能では、同様の方法でSinglyLinkedListをインスタンス化しました。 SinglyinkedList list;それはそこで働く。 –

+0

@DevendraVermaこれはポインタではありません。もしあなたが 'SinglyinkedList * list;'と 'list-> insertFromHead(10);'を持っていたら、おそらく(確かではないが)いくつかの問題に遭遇するでしょう。 – molbdnilo

+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

生ポインタを使用すると後で 'delete'が必要になることを指摘しておきましょう。これは理想的にはコンストラクタで行われるのが理想です。スマートポインタ – UKMonkey

0

あなたの問題を解決します:あなたはそれを間接参照

関連する問題