练习数据结构时,当创建链表时需要输入数据域的内容,也即在create()函数中用到了cin,create()中的cin是以while(cin)来检测cin的状态作为循环的终止,但是当多次调用create()时,只有第一次完全输入正确,以后的要么就是不等待输入,要么就是输入的和得到的不匹配。
思考了一下,觉得是cin的问题,因为第一次输入完成,也即遇到一个输入使得cin返回false,但是这个输入依然保留在cin中,并未被刷新,于是在每次while(cin)前加上了cin.clear(),问题依旧。上网查到是要添加cin.ignore(),加上试了下,果然好了。
于是查了一下,cin.clear()和cin.ignore();
http://www.cplusplus.com/给的解释分别如下:
std::istream::ignore:
Extracts characters from the input sequence and discards them, until either n characters have been extracted, or one compares equal to delim.就是说它会丢弃原本在输入流中的内容,直到遇到一个
delimiter(定界符)。
对应于我的例子,就是将第一次输入中最后一个用来标识结束的字符丢弃掉。从而输入就正常了。
ios::clear
Sets a new value for the stream's internal error state flags.也就是将流的所有状态都重设为有效状态。
对应于我的例子,就是将上一次的cin重设为有效。
好吧。虽然很简单,但是不注意的话会导致不明原因的bug,浪费宝贵的时间来调试。所以还是值得注意一下的。
顺便贴一下我用单链表实现的多项式相加:
//单链表的应用
//-------------
//多项式相加
//每个多项式为一个单链表,链表数据域为系数和指数
//多项式的相加可抽象为两个单链表的Merge操作
#include <iostream>
using namespace std;
typedef struct LNode
{
float coef; //系数
int expn; //指数
LNode* next;
}LNode,*List;
void createList(List& L)
{
float coef;
int expn;
L=(List)malloc(sizeof(LNode));
L->next=NULL;
LNode* q=L;
while((cin>>coef)!=NULL)
{
cin>>expn;
LNode* p=(LNode*)malloc(sizeof(LNode));
p->coef=coef;
p->expn=expn;
p->next=q->next;
q->next=p;
q=q->next;
}
}
void visit(float f,int i)
{
cout<<"coef: "<<f<<" "<<"expn: "<<i<<endl;
}
void ListTraverse(List L,void (*visit)(float,int))
{
L=L->next;
while(L!=NULL)
{
visit(L->coef,L->expn);
L=L->next;
}
}
void add(List& polyA,List& polyB,List& result)
{
LNode* pa=polyA->next;
LNode* pb=polyB->next;
LNode* pc=polyA;
result=polyA;
while(pa!=NULL&&pb!=NULL)
{
if(pa->expn<pb->expn)
{
pc->next=pa;
pc=pc->next;
pa=pa->next;
}
else if(pa->expn>pb->expn)
{
pc->next=pb;
pc=pc->next;
pb=pb->next;
}
else
{
pa->coef+=pb->coef;
pc->next=pa;
pc=pc->next;
pa=pa->next;
LNode* tmp=pb;
pb=pb->next;
free(tmp);
}
}
if(pa==NULL)pc->next=pb;
if(pb==NULL)pc->next=pa;
}
int main()
{
List polyA,polyB;
createList(polyA);
ListTraverse(polyA,visit);
cin.clear();
cin.ignore();
cout<<"----------------------"<<endl;
createList(polyB);
ListTraverse(polyB,visit);
List result;
cout<<"-----------------------"<<endl;
add(polyA,polyB,result);
ListTraverse(result,visit);
system("pause");
}