2012-03-30 15 views
1

リンクされたリストを作成しましたが、ノードの値を出力しようとしたときに、NULLをバインドとして使用したときに機能しませんでした。例:リンクされたリスト - ポインタ

#include <iostream> 

typedef struct Node; 
typedef Node* Node_ptr; 
struct Node 
{ 
    int i; 
    Node_ptr next; 
}; 

int main() 
{ 
    Node_ptr ptr, head; 
    ptr = new Node; 
    head = ptr; 

    // load 
    for(int j = 0; j < 4; j++) 
    { 
     ptr->next = new Node; 
     ptr->i = j; 
     ptr = ptr->next; 
    } 

    // print 
    ptr = head; 
    while(ptr->next != NULL) 
    { 
     std::cout << "print: " << ptr->i << std::endl; 
     ptr = ptr->next; 
    } 
} 

ただし、このコードを実行すると、コードはwhileループで無限ループに陥ります。 リンクされたリストが5ノードだけであることは決して理解できません。なぜそれが起こるのか理解できません。

+0

有効なCまたはC++コードではありません。セミコロンや行方不明の 'typedef'、'} 'がありません... –

+0

NULLをチェックしていますが、どこに設定しましたか? – tinman

+0

そしてそれを修正したら、デバッグをする必要があります。 –

答えて

5

ポインタを(NULLに)初期化する必要があるかもしれません。さもなければ、ポインタはゴミだけを含んでいて、有効なポインタとして表示されます。例えば

:あなたははっきりptr->nextNULLになるまで継続することをコード化

for(j = 0; j < 4; j++) 
{ 
    ptr->next = new Node; 
    (ptr->next)->next = NULL; 
    ptr->i = j; 
    ptr = ptr->next; 
} 
+0

+1で問題の原因を特定してください。しかし、私は '(ptr-> next) - > next = NULL;を手動で設定するのではなく、コンストラクタを使うことに頼るでしょう。 –

+0

@ e.James PODタイプを初期化するためにコンストラクタは必要ありません。私の提案を参照してください。 –

+0

@ルチアン:私はあなたの答えをアップアップしましたが、公平であるために、コンストラクタは間違いを起こしにくいものにしました(何らかの理由でOPが彼のタイプをC++ 03 PODにする必要がない限り)。 – ildjarn

3
while(ptr->next != NULL) 

。おそらく、リスト内の少なくとも1つの項目に対してptr->nextNULLに設定する必要がありますか?このため、Cmemset(&object, 0, sizeof(object));、またはC++にコンストラクタがあるのが一般的です。初期化

typedef struct Node 
{ 
    int i; 
    Node* next; 
    Node() : i(0), next(NULL) {} //prevents this problem 
} 
4

てみ値は、あなたのNode

ptr = new Node(); 

代わりに、それ以外の場合は

ptr = new Node; 

の、あなただけのメンバーでゴミを持っています。

+0

ああ、これははるかに簡単な解決策ですか? –

関連する問題