更新:あなたが私と同様の立場にあり、プログラムを改訂したい場合は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をリンクすると、どのようにリンクできますか?
'addNode'メソッドは次のポインタを設定します:' previousNode - > ptrNext = currentNode; '。私が間違っていない限り? – cehnehdeh
あなたはこの行から混乱を招くかもしれません: 'currentNode = new node;'新しい名前を作る代わりに変数名を再利用することを選択しました。おそらく 'node * newNode = new node;'と書いて、 'previousNose'を完全に取り除いてしまったでしょう。 –
"私はおそらくnode * newNode = new node;と書いたでしょうし、previousNoseを完全に取り除いてしまいました。これはトリックでした、それは今より多くの意味があります。私は答えについて、特に私の質問にはまだ分かりませんが、今は少なくとも私は理にかなったプログラムを持っています。ありがとう! –