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 信号,这可能导致 >> 操作返回 false,因为用户已发出标准输入结束信号。

于 2013-01-27T04:35:59.573 回答