2016-04-01 14 views
1

私は機能を実行したい非常に単純なリンクリストを持っていますが、私は自分のコードを実行すると 'root'ノードで読み取りアクセス違反エラーが発生します。ここでC++でリンクされたリストの読み取りアクセス違反

私が手にエラーが(コードの行は、私はエラーを取得した後、私はコメントし)されます。

例外がスローさ:アクセス違反をお読みください。 ルートは0xCCCCCCCCでした。 この例外のハンドラがある場合は、プログラムを安全に続行できます。

これは構造体である:

struct node { 
int value; 
node* link; 

node(int val) { 
    link = NULL; 
    value = val; 
} 
}; 

まず私はこのような主な機能でそのリンクリストを初期化:

int main() 
{ 
node *root; 

addnode(root, 20); 
addnode(root, 1); 
addnode(root, 50); 


node *curr; 
for (curr = root; curr->link != NULL; curr = curr->link) { // I get error here 
    cout << curr->value << " "; 
} 
cout << endl; 

cout << "Number of elements " << countlist(root) << endl; 

getchar(); 
return 0; 
} 

と(最初のものは、ノードを追加していると呼ばれている機能を、リスト内のノードの数を数えます。):

void addnode(node *&root, int val) { 
if (root != NULL) { // I get error here 
    node *temp=new node(val); 
    temp->link = root; 
    root = temp; 
} 
else 
    root = new node(val); 
} 

int countlist(node *root) { 
if (root != NULL) { 
    int count = 0; 

    do { 
     count++; 
     root = root->link; 
    } while (root->link != NULL); // I get error here 

    return count; 
} 
return 0; 
} 

T彼は私がコード内のコメントで言及した行に入っています。

+0

セイ、 'root == 0x12345'、' root-> next == NULL'のようになります。あなたの状態が何を確認すると思いますか? –

+1

'root'は初期化されていませんが、(ランダムな、初期化されていない)値が使用されます。 –

+0

あなたのコードはうまく動作します。このバグを再現するための詳細情報を提供できますか? – LibertyPaul

答えて

1

良い習慣は、宣言時にすべての変数を初期化するかもしれないこの種の問題を避けるために:また

int main() 
{ 
    node *root = nullptr; 
    // ... 
} 

、あなたはしたくない:

node *curr; 
for (curr = root; curr->link != NULL; curr = curr->link) { 
    cout << curr->value << " "; 
} 

しかし

for (node *curr = root; curr != nullptr; curr = curr->link) { 
    cout << curr->value << " "; 
} 
+0

これはうまくいきましたが、メインの 'addnode(root、20)'に追加した最初の要素は、リストを出力すると表示されず、カウント関数にはカウントされません(ただ消える) –

+0

SOに関する新しい質問を追加あなたの現在の問題 – zoska

関連する問題