#include <iostream>
using namespace std;
struct Node
{
char item;
Node *next;
};
void inputChar ( Node * );
void printList (Node *);
char c;
int main()
{
Node *head;
head = NULL;
c = getchar();
if ( c != '.' )
{
head = new Node;
head->item = c;
inputChar(head);
}
printList(head);
return 0;
}
void inputChar(Node *p)
{
getchar();
while ( c != '.' )
{
p->next = new Node;
p->next->item = c;
inputChar(p->next);
}
p->next = new Node; // dot signals end of list
p->next->item = c;
}
void printList(Node *p)
{
if(p = NULL)
cout << "empty" <<endl;
else
{
while (p->item != '.')
{
cout << p->item << endl;
printList(p->next);
}
}
}
我正在尝试创建一个由用户输入的字符链表。句点表示输入的结束。我的程序继续循环inputChar函数。有什么想法吗?
答案 0 :(得分:2)
也许您应该添加:
c = getchar();
但是,你正在做的事情有点危险。在某些平台上,getchar()
将在使用上一个getchar()
调用的ENTER键后立即返回。所以你应该考虑在循环中。也许在inputChar函数中添加一个额外的getchar()
?
此外,保罗写的是真的。您应该使用简单的while
更改if
循环。
答案 1 :(得分:2)
因为你永远不会在循环中更改c
的值。那为什么它会爆发呢?
您只需在循环前设置一次c
的值。
答案 2 :(得分:2)
你有inputChar调用inputChar。当你深入到inputChars并且得到。时,当它返回时,它的调用者仍然有c等于它调用inputChar之前的任何东西,所以它继续循环。
答案 3 :(得分:2)
澄清变化getchar(); to c = getchar();在inputChar过程的第一行。
答案 4 :(得分:1)
考虑类似这样的东西,它测试过早结束和指定的行尾分隔符,并允许你在将来指定与std :: cin不同的流。
void inputChar(Node *p, std::istream& in = std::cin)
{
char ch;
while(in.get(ch) && in && ch != '.')
{
...
}
}