2011-06-20 3 views
1

私はcprogramming.comからチュートリアルを読んでいますが、リンクされたリストの例がちょっと残っています。コードは、以下である:0リンクリストを理解するチュートリアル

#include <iostream> 

using namespace std; 

struct node { 
    int x; 
    node *next; 
}; 

int main() { 
    node *root; 
    node *conductor; 

    root = new node; 
    root->next = 0; 
    (*root).x = 12; // I was testing alt. syntax. 
    conductor = root; 

    if(conductor != 0) { 
    while(conductor->next != 0) { 
     cout << conductor->x; 
     conductor = conductor->next; 
    } 
    } 

    conductor->next = new node; 
    conductor = conductor->next; 
    conductor->next = 0; 
    (*conductor).x = 42; 

    cout << conductor->x; 

    return 0; 
} 
root->next

例では設定されています。 conductorは、rootのアドレスに設定されています。つまり、whileループには決して到達できません。

リンクされたリストの使用を実証していない(つまり、ノードを追加して、それを通り抜ける)場合、この例の目的を理解できません。

コードを正しく解析していますか?

+0

ChrisWue

+0

指揮棒==ルートとルート!= 0のため、whileループに達するでしょう。 – weekens

+0

この情報は基本的にはCです。ストリーム。 C++は、コンストラクタと自動メモリ処理を使用して、はるかに優れた構造を持ちます。 –

答えて

0
root = new node; 
root->next = 0; 

は新しいnode &が0nextポインタを初期化作成します。

conductor = root; 

セット一方がリンクリストの末尾に移動する必要が新しいノードを追加するためにroot

if(conductor != 0) 
{  
    while(conductor->next != 0) 
    {  
     cout << conductor->x;  
     conductor = conductor->next; 
    } 
} 

のアドレスへのポインタconductor、ループはそれを行いながら、上記。

恐らく、このサンプルコードは、既存のリンクリストコードから断片を組み立てることによって素早くまとめられました。 リンクリストにノードが1つしかないことがわかっている場合は、whileループは実際には必要ありません。おそらく、元のコードではaddNodeToList()のようないくつかの関数の一部であったでしょう。新しいノードをリストに追加する前に、リストの最後に移動する必要があります。

+0

しかし、次に別のノードのアドレスを含むべきではありませんか? –

+0

@James:もっと長いリストが必要な場合にのみ:) –

0

これはnullにすることはできませんここでは、すべての

root = new node; 
//then later 
conductor = root; 
if(conductor != 0) { 

conductorでは意味がありません - チェックは、その後、conductorroot等しいここ

while(conductor->next != 0) { 

無意味なので、conductor->nextはnullです

conductor->next = new node; 

さらに、すべてを作成するdノードは、プログラムが終了するとちょうどリークします。このサンプルは何も示していません。

+0

ここに、http://www.cprogramming.com/tutorial/lesson15.htmlの例があります。私はその時間を無駄にしたようです。リンクリストを作成する良い例が分かりますか? –

+0

ここには説明文があります:http://cplus.about.com/od/learningc/ss/pointers2.htm – inquam

+0

@James Perno:別々の操作のために別々の機能を使用するコードを探します。 「空のリストを作成する」、「最初にノードを追加する」、「このノードの後に​​削除する」などがあります。このような操作によって、事前条件と事後条件が明確になり、より理解を深めることができます。 – sharptooth

0

指揮は、その後しばらく ループを意味し、ルートの アドレスに設定されているが、右に到達することはありませんか?

rootが非0であれば、conductorはまた、非0である、だから、while()ループは確実に到達することになります。

1

この例では、whileループはスキップする必要があります。conductor-> nextは最初から0になるためです。

これはおそらく簡単な間違いで、著者はリストが一般的に横断される方法を示したいと思っています。そのコードは実際には完全に正しいものです。私の推測では、&(おそらく彼自身の)LinkedListクラスからこのコードを貼り付けて、それをテストせずに徹底的に考えていない簡単な例を組み立てようとしました。今のところ動作しますが、whileループは基本的に何もしないので無意味ですが、おそらくそれは作者の意図ではありませんでした。

0

あなたの例のコードは、おそらく何かを記述していますが、私の目では何も生産的ではありません:)。 whileループの前から、ルートの導体は同じものを指しており、そのオブジェクトの次のはを含んでいます。したがって、whileループは決して起動しません。その後、新しいノードを作成し、の次のを指すようにします。次に、ノードにの指揮官を指し、からに設定します。これにより、メモリリークが発生します。

0

next = 0は、ゼロ終端文字列に似たリストの末尾を示します。一般的にリンクされたリストを持つ規約です。リストに値を入力すると、ゼロ終了のnextポインターがリスト全体に移動します。他のすべてのノードは、リスト内の次のノードを指す有効なnext値を持っています。

関連する問題