//程序错在哪里
//请高手快点指教
#include<fstream.h>
#include<stdio.h>
#define NULL 0
class CircList;
class CircListNode{             //结点类(把它看作是多项式的一项)
friend class CircList;
public:
CircListNode(int c=0,int e=0,CircListNode *next=NULL):
  coef(c),exp(e),link(next){}
int coef;//系数
int exp; //指数
CircListNode *link;
};
class CircList{ //循环链表类(把它当作一个多项式)
public:
CircList():current(NULL),first(NULL){}
friend CircList operator +(CircList &,CircList &);//多项式的加法
friend CircList operator -(CircList &,CircList &);//减法
friend CircList operator *(CircList &,CircList &);
int compare(int,int);//系数或是指数的比较
bool NotNull(){if(current!=NULL) return true; else return false;}
bool IsEmpty(){return first->link==first;}
CircListNode *Firster(){current=first;return current;}
CircListNode *Next(){current=current->link;return current;}
CircListNode *A,*B,*C;
private:
CircListNode *first,*current;
};
CircList operator +(CircList &Aiter,CircList &Biter){
CircListNode *ax,*bx,*cx,*dx;
CircList Citer;//多项式Aiter和Biter的和保存到Citer中,下同
ax=dx=Aiter.Firster();//链表带有头结点
ax=Aiter.Next();//找到第一项
delete dx;//利用dx来释放用过的链表
bx=dx=Biter.Firster();
bx=Biter.Next();
delete dx;
cx=Citer.Firster();
cx=Citer.Next();
while(Aiter.NotNull()&&Biter.NotNull())
switch(Citer.compare(ax->exp,bx->exp)){
case'=':
cx->coef=ax->coef+bx->coef;
dx=ax;
ax=Aiter.Next();
delete dx;
dx=bx;
bx=Biter.Next();
delete dx;
if(!cx->coef){//当系数为0时,则不保留
dx=cx;
delete dx;
}
else cx=Citer.Next();
break;
case'>':
cx=bx;
dx=bx;
bx=Biter.Next();
delete dx;
cx=Citer.Next();
break;
case'<':
cx=ax;
dx=ax;
ax=Aiter.Next();
delete dx;
cx=Citer.Next();
break;
}
if(Aiter.NotNull()){
cx=ax;
dx=ax;
ax=Aiter.Next();
delete dx;
cx=Citer.Next();
}
else{
cx=bx;
dx=bx;
bx=Biter.Next();
delete dx;
cx=Citer.Next();
}
return Citer;
}
CircList operator -(CircList &Aiter,CircList &Biter){//和加法大致相同
CircListNode *ax,*bx,*cx,*dx;
CircList Citer;
ax=dx=Aiter.Firster();
ax=Aiter.Next();
delete dx;
bx=dx=Biter.Firster();
bx=Biter.Next();
delete dx;
cx=Citer.Firster();
cx=Citer.Next();
while(Aiter.NotNull()&&Biter.NotNull())
switch(Citer.compare(ax->exp,bx->exp)){
case'=':
cx->coef=ax->coef-bx->coef;
dx=ax;
ax=Aiter.Next();
delete dx;
dx=bx;
bx=Biter.Next();
delete dx;
if(!cx->coef){
dx=cx;
delete dx;
}
else cx=Citer.Next();
break;
case'>':
cx->coef=-bx->coef;
dx=bx;
bx=Biter.Next();
delete dx;
cx=Citer.Next();
break;
case'<':
cx=ax;
dx=ax;
ax=Aiter.Next();
delete dx;
cx=Citer.Next();
break;
}
if(Aiter.NotNull()){
cx=ax;
dx=ax;
ax=Aiter.Next();
delete dx;
cx=Citer.Next();
}
else{
cx->coef=-bx->coef;
dx=bx;
bx=Biter.Next();
delete dx;
cx=Citer.Next();
}
return Citer;
}
CircList operator *(CircList &Aiter,CircList &Biter){
CircListNode *ax,*bx,*cx,*dx;
CircList Citer;
ax=dx=Aiter.Firster();
ax=Aiter.Next();
delete dx;
bx=dx=Biter.Firster();
bx=Biter.Next();
delete dx;
cx=Citer.Firster();
cx=Citer.Next();
while(ax==Aiter.first){
bx=Biter.Firster();
bx=Biter.Next();
while(bx==Biter.first){
cx->coef=ax->coef*bx->coef;
cx->exp=ax->exp+bx->exp;
bx=Biter.Next();
cx=Citer.Next();
}
ax=Aiter.Next();
}
return Citer;
}
int CircList::compare(int x,int y){
if(x<y) return 60;//60为小于号的ASCII码
if(x==y) return 61;
else return 62;
}
void main()//                           主函数
{
ifstream infile("输入文件");//文件输入
if(!infile){
cout<<"不能打开输入文件"<<endl;
return;
}
CircList Ax,Bx,Cx;
Ax.A=Ax.Firster();
Ax.A=Ax.Next();
for(int i=0;i<6;i++){//设Ax有6项…………这里条件怎么样才更好了?
infile>>Ax.A->coef>>Ax.A->exp;
Ax.A=Ax.A->link;
cout<<Ax.A->coef<<"x^"<<Ax.A->exp<<"+";
}
Bx.B=Bx.Firster();
Bx.B=Bx.Next();
for(i=0;i<6;i++){//设Bx有6项
infile>>Bx.B->coef>>Bx.B->exp;
Bx.B=Bx.B->link;
cout<<Bx.B->coef<<"x^"<<Bx.B->exp<<"+";
}
char huili=getchar();
switch(huili){
case '+':Cx=Ax+Bx;break;
case '-':Cx=Ax-Bx;break;
case '*':Cx=Ax*Bx;break;
default:cout<<"输入了错误符号!\n";break;
}
cout<<"\n结果为:\n";
Cx.C=Cx.Firster();
Cx.C=Cx.Next();
while(Cx.NotNull()){//这里的条件
cout<<Cx.C->coef<<"x^"<<Cx.C->exp<<"+";
Cx.C=Cx.C->link;
}
infile.close();
cout<<endl;
return;
}