Polynomial.h
#include<iostream>
using namespace std;//ostream,istream,cout,endl
struct Term//多项式节点类
{
float coef;
int exp;
Term *link;
Term(float c,int e,Term *next=NULL)
{
coef=c;
exp=e;
link=next;
}
Term *InsertAfter(float c,int e);
friend ostream& operator<<(ostream&,const Term&);
};
class Polynomial//多项式类
{
public:
Polynomial()
{
first=new Term(0,-1);
}
Polynomial(Polynomial& R);
int maxOrder();
Term *getHead() const
{
return first;
}
private:
Term *first;
friend ostream& operator<<(ostream&,const Polynomial&);
friend istream& operator>>(istream&,Polynomial&);
friend Polynomial operator +(Polynomial&,Polynomial&);
friend Polynomial operator *(Polynomial&,Polynomial&);
};
Term* Term::InsertAfter(float c,int e)
{
link=new Term(c,e);//
return link;
}
ostream& operator<<(ostream& out,const Term& x)
{
if(x.coef==0.0)
return out;
out<<x.coef;
switch(x.exp)
{
case 0:break;
case 1:out<<"X";break;
default:out<<"X"<<x.exp;break;
}
return out;
}
Polynomial::Polynomial(Polynomial& R)
{
first=new Term(0,-1);
Term *desptr=first;
Term *srcptr=R.getHead()->link;
while(srcptr!=NULL)
{
desptr->InsertAfter(srcptr->coef,srcptr->exp);
desptr=desptr->link;
srcptr=srcptr->link;
}
}
int Polynomial::maxOrder()
{
Term *current=first;
while(current->link!=NULL)
current=current->link;
return current->exp;
}
istream& operator>>(istream& in,Polynomial& x)
{
Term *rear=x.getHead();
int c,e;
while(1)
{
cout<<"Input a term(coef,exp):"<<endl;
in>>c>>e;
if(e<0)
break;
rear=rear->InsertAfter(c,e);
}
return in;
}
ostream& operator<<(ostream& out,Polynomial& x)
{
Term *current=x.getHead()->link;
cout<<"The polynomial is:"<<endl;
bool h=true;
while(current!=NULL)
{
if(h==false&¤t->coef>0.0)
out<<"+";
h=false;
out<<*current; //调用Term类的重载操作
current=current->link;
}
out<<endl;
return out;
}
Polynomial operator +(Polynomial& A,Polynomial& B)
{
Term *pa,*pb,*pc,*p;
float temp;
Polynomial C;
pc=C.first;
pa=A.getHead()->link;
pb=B.getHead()->link;
while(pa!=NULL&&pb!=NULL)
{
if(pa->exp==pb->exp)
{
temp=pa->coef+pb->coef;
if(fabs(temp)>0.001)
pc=pc->InsertAfter(temp,pa->exp);
pa=pa->link;
pb=pb->link;
}
else if(pa->exp<pb->exp)
{
pc=pc->InsertAfter(pa->coef,pa->exp);
pa=pa->link;
}
else
{
pc=pc->InsertAfter(pb->coef,pb->exp);
pb=pb->link;
}
}
if(pa!=NULL)
p=pa;
else
p=pb;
while(p!=NULL)//处理链剩余部分
{
pc=pc->InsertAfter(p->coef,p->exp);
p=p->link;
}
return C;
}
Polynomial operator *(Polynomial& A,Polynomial& B)
{
Term *pa,*pb,*pc;
int AL,BL,i,k,maxExp;
Polynomial C;
pc=C.getHead();
AL=A.maxOrder();
BL=B.maxOrder();
if(AL!=-1||BL!=-1)
{
maxExp=AL+BL;
float *result=new float[maxExp+1];
for(i=0;i<=maxExp;i++)
result[i]=0.0;
pa=A.getHead()->link;
while(pa!=NULL)
{
pb=B.getHead()->link;
while(pb!=NULL)
{
k=pa->exp+pb->exp;
result[k]=result[k]+pa->coef*pb->coef;
pb=pb->link;
}
pa=pa->link;
}
for(i=0;i<=maxExp;i++)
{
if(fabs(result[k]>0.001))
{
pc=pc->InsertAfter(result[i],i);
}
}
delete []result;
}
pc->link=NULL;
return C;
}
main.cpp
#include<iostream>
#include"Polynomial.h"
using namespace std;
int main()
{
Polynomial A;
Polynomial B;
Polynomial C;
cout<<"输入两个多项式(多项式的每一项的指数递增)"<<endl;
cin>>A;
cout<<A;
cin>>B;
cout<<B;
C=A+B;
cout<<C;
return 0;
}