请考虑使用此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 ,然后 输入来终止 即可。但是,如果我们使用cin&gt;&gt;替换while(cin&gt;&gt; n)with while(true) N;在循环内部,如此处所示
while(true)
{ cin >> n;
p = new Node(n,q); q = p;}
然后在用户尝试终止时,循环继续自动创建新节点!为什么?? 提前致谢
答案 0 :(得分:3)
它继续运行,因为循环条件为true
,使其成为无限循环。如果要打破无限循环,可以使用break
语句,例如
while (true) {
if (!(cin >> n)) {
break; // exits the loop
}
p = new Node(n,q);
q = p;
}
答案 1 :(得分: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;
}
答案 2 :(得分:0)
Ctrl + D表示EOF,这可能会导致&gt;&gt;返回false的操作,因为用户已发出stdin的结束信号。