2016-04-15 6 views
0

更新:あなたが私と同様の立場にあり、プログラムを改訂したい場合はDavid Graysonの応答をご覧ください。リンクされたリストのヘッドポインタが魔法のように割り当てられていても動作しないはずですが


私はCS202のリンクリストを学習していますが、動作するプログラムを作成しましたが、そうしてはいけません。それがうまくいかない理由は、最初のノードのポインタを次のノードに割り当てることは決してありませんが、プログラムは完全にコンパイルされて実行されます。

(あるいは、少なくとも、これは私がそれを理解する方法です。もちろん、私はいくつかのレベルで間違ってなければなりません。)

私は、これはきれいなコードではありませんけど、私は台無しにしたくありませんでしたなんらかの理由で、すでにそれが動作しているときに、それと共に。

#include <iostream> 

using namespace std; 

//STRUCTS 

struct node 
{ 
    int num; 
    node *ptrNext; 
}; 

//FUNCTIONS 

node *addNode(node *currentNode, int i) 
{ 
    node *previousNode = currentNode; 

    currentNode = new node; 
    currentNode -> num = i; 
    currentNode -> ptrNext = nullptr; 

    previousNode -> ptrNext = currentNode; 

    return currentNode; 

} 

void printList(node *printingNode) 
{ 
    while (printingNode -> ptrNext != nullptr) 
    { 
     printingNode = printingNode -> ptrNext; 
     cout << printingNode -> num << ", "; 
    } 
} 

//MAIN 

int main() 
{ 
    node *head = new node; 
    node *current; 

    head -> num = NULL; 
    head -> ptrNext = nullptr; 

    current = addNode(head, 23); 
    current = addNode(current, 28); 
    current = addNode(current, 45); 
    current = addNode(current, 57); 

    printList(head); 

    return 0; 
} 

プログラムはエラーや警告なしにコンパイルし、出力は次のようになります。

23, 28, 45, 57, 

私のインストラクターと私はこれに困惑しています。 printList関数でhead-> ptrNextをリンクすると、どのようにリンクできますか?

+2

'addNode'メソッドは次のポインタを設定します:' previousNode - > ptrNext = currentNode; '。私が間違っていない限り? – cehnehdeh

+0

あなたはこの行から混乱を招くかもしれません: 'currentNode = new node;'新しい名前を作る代わりに変数名を再利用することを選択しました。おそらく 'node * newNode = new node;'と書いて、 'previousNose'を完全に取り除いてしまったでしょう。 –

+0

"私はおそらくnode * newNode = new node;と書いたでしょうし、previousNoseを完全に取り除いてしまいました。これはトリックでした、それは今より多くの意味があります。私は答えについて、特に私の質問にはまだ分かりませんが、今は少なくとも私は理にかなったプログラムを持っています。ありがとう! –

答えて

1

addNode関数がこれを処理します。 addNodeが呼び出されると、ptrNextの値が作成された新しいノードに設定されます。私は

previousNode -> ptrNext = currentNode; 

を行うと

+0

しかし、私は決してcurrentNode - > ptrNext = nullptr以外の何もしません。つまり、headがcurrentNodeの場合、最初にaddNodeが呼び出されたときに、それが指すノードにはptrNext = nullptrが割り当てられます。 –

+0

しかし、あなたは '* previousNode = currentNode'と' previousNode - > ptrNext = currentNode'を行います – Thomas

0

ポインタpreviousNodeは、ヘッドノードに設定し、ちょうど作成したものにヘッドノードにptrNextを変更されています。

GaiusOctavianは技術的に正解ですが、ポインタが複雑であるため、わかりませんでした。しかし、それを明確にするために、ありがとう!


私の新しいプログラムは、デビッド・グレイソンのアドバイスを活用しています:

node *addNode(node *inputNode, int input) 
{ 
    node *newNode = new node; 
    newNode -> num = input; 
    newNode -> ptrNext = nullptr; 

    inputNode -> ptrNext = newNode; 

    return newNode; 
} 

これは単に、ノードをとり、新しいものを作成し、その後、新しいものへの入力ノードをリンクし、新しいものを吐き出します。

関連する問題