0

リンクされたリストの作成とトラバースについては、この C++ コードを検討してください (ノードの数は、プログラマーではなくユーザーが決定する必要があります)。

#include <iostream>
using namespace std;
class Node
{ 
 public:
 int data; Node* next;
 Node(int d, Node* j): data(d),next(j) {cout << "Constructor\n";}
};

int main()
{int n; Node* p; Node* q = 0;

while(cin >> n) 
{ p = new Node(n,q);
  q = p;}

for(;p->next; p=p->next)
    cout << p->data << "->";
    cout << p-> data << "->*\n";
return 0;}

上記のコードは完全に機能し、ユーザーがCtrl+Dの後にEnter. ただし、cin >> n を使用して while(cin >> n) を while (true) に置き換えると、ここに示すように、ループ内

    while(true) 
    { cin >> n;
    p = new Node(n,q); q = p;}

その後、ユーザーが終了しようとすると、ループが続行され、新しいノードが自動的に作成されます!! どうして??前もって感謝します

4

3 に答える 3

3

ループ条件がtrueであるため継続し、無限ループになります。無限ループから抜け出したい場合は、breakステートメントを使用できます。

while (true) {
    if (!(cin >> n)) {
        break; // exits the loop
    }
    p = new Node(n,q);
    q = p;
}
于 2013-01-27T04:34:55.770 に答える
1

おそらく、コードcin >> nがファイルの終わりに到達すると、何らかの形で自動的にループから抜け出すという誤解があります。実際、元の例または@MrFoozのソリューションに示されているように、ファイルの終わりを暗黙的にチェックするか、以下に示すように明示的にチェックする必要があります。

while(true) { 
    cin >> n;
    if (cin.eof()) break; // We're explicitly checking for EOF here
    p = new Node(n,q);
    q = p;
}
于 2013-01-27T04:51:25.677 に答える
0

Ctrl+D は EOF を通知します。ユーザーが stdin の終了を通知したため、>> 操作が false を返す可能性があります。

于 2013-01-27T04:35:59.573 に答える