#include
using namespace std;
template
struct Term
{
Term( T c=T(),int e=0,Term* next=NULL):coef(c),exp(e){link=next;}
T coef;
int exp;
Term* link;
};
template
class Polynominal
{
public:
Polynominal();
~Polynominal();
Polynominal(const Polynominal& x);
void Output(std::ostream& out) const;
void Input(std::istream& in);
Polynominal &operator = (const Polynominal &x);
Polynominal operator-() const;
Polynominal operator + (const Polynominal &x) const;
Polynominal operator * (const Polynominal &x) const;
void Clear();
private:
Term* thelist;
friend std::ostream& operator << <>(std::ostream&,const Polynominal &x);
friend std::istream& operator >> <>(std::istream& in,Polynominal &x);
};
template
Polynominal::Polynominal()
{
thelist=new Term();
}
template
Polynominal::~Polynominal()
{
Clear();
}
template
Polynominal::Polynominal(const Polynominal& x)
{
thelist=new Term();
Term* mytemp=thelist;
Term* xtemp=x.thelist;
for(;xtemp->link!=NULL;xtemp=xtemp->link,mytemp=mytemp->link)
{
mytemp->coef=xtemp->coef;
mytemp->exp=xtemp->exp;
mytemp->link=new Term();
}
}
template
Polynominal& Polynominal::operator = (const Polynominal& x)
{
Term* xtemp=x.thelist;
Clear();
thelist=new Term();
Term* head=thelist;
for(;xtemp->link!=NULL;xtemp=xtemp->link,thelist=thelist->link)
{
thelist->coef=xtemp->coef;
thelist->exp=xtemp->exp;
thelist->link=new Term();
}
thelist->link=0;
thelist=head;
return *this;
}
template
Polynominal Polynominal::operator - () const
{
Polynominal temp;
Term* mytemp=thelist;
Term* newhead=temp.thelist;
for(;mytemp->link!=NULL;mytemp=mytemp->link,temp.thelist=temp.thelist->link)
{
temp.thelist->coef=-mytemp->coef;
temp.thelist->exp=mytemp->exp;
temp.thelist->link=new Term();
}
temp.thelist->link=0;
temp.thelist=newhead;
return temp;
}
template
Polynominal Polynominal::operator + (const Polynominal& x) const
{
Polynominal temp;
Term* mytemp=thelist;
Term* xtemp=x.thelist;
Term* newhead=temp.thelist;
while(mytemp->link!=NULL&&xtemp->link!=NULL)
{
int result=mytemp->exp-xtemp->exp;
if(result==0)
{
temp.thelist->exp=mytemp->exp;
temp.thelist->coef=mytemp->coef+xtemp->coef;
temp.thelist->link=new Term();
if(temp.thelist->coef!=0)
{
mytemp=mytemp->link;
xtemp=xtemp->link;
temp.thelist=temp.thelist->link;
}
}
if(result<0)
{
temp.thelist->exp=mytemp->exp;
temp.thelist->coef=mytemp->coef;
temp.thelist->link=new Term();
mytemp=mytemp->link;
temp.thelist=temp.thelist->link;
}
if(result>0)
{
temp.thelist->exp=xtemp->exp;
temp.thelist->coef=xtemp->coef;
temp.thelist->link=new Term();
xtemp=xtemp->link;
temp.thelist=temp.thelist->link;
}
}
if(mytemp->link!=NULL)
{
temp.thelist->link=mytemp;
}
if(xtemp->link!=NULL)
{
for(;xtemp->link!=NULL;xtemp=xtemp->link,temp.thelist=temp.thelist->link)
{
temp.thelist->coef=xtemp->coef;
temp.thelist->exp=xtemp->exp;
temp.thelist->link=new Term();
}
}
temp.thelist=newhead;
return temp;
}
template
Polynominal Polynominal::operator * (const Polynominal& x) const
{
Polynominal result;
Term* mytemp=thelist;
Term* xtemp=x.thelist;
for(;mytemp->link!=NULL;mytemp=mytemp->link)
{
Polynominal temp;
Term* temphead=temp.thelist;
for(;xtemp->link!=NULL;xtemp=xtemp->link,temp.thelist=temp.thelist->link)
{
temp.thelist->coef=(mytemp->coef)*(xtemp->coef);
temp.thelist->exp=(mytemp->exp)+(xtemp->exp);
temp.thelist->link=new Term();
}
temp.thelist->link=0;
temp.thelist=temphead;
if(result.thelist->link!=NULL)
result=result+temp;
else
result=temp;
xtemp=x.thelist;
}
return result;
}
template
void Polynominal::Output(std::ostream& out) const
{
out<<"the Polynominal is:"< Term* head=thelist;
while(head->link!=NULL)
{
if(head->coef!=0)
{
if(head!=thelist)
out<<"+";
if(head->coef!=1)
out<coef;
if(head->exp!=1)
out<<"X^"<exp;
else
out<<"X";
}
head=head->link;
}
out<
}
template
void Polynominal::Input(std::istream& in)
{
Term* head=thelist;
bool result=false;
cout<<"input the Polynominal (-1 -1) for end"<do
{
result=(in>>thelist->coef>>thelist->exp);
bool end=(thelist->coef==-1)||(thelist->exp==-1);
if(result)
{
if(!end)
{
thelist->link=new Term();
thelist=thelist->link;
}
else
break;
}
else
{
cout<<"input error"< {
thelist->coef=0;
thelist->exp=0;
thelist->link=0;
}
break;
}
}
while(true);
thelist=head;
}
template
void Polynominal::Clear()
{
Term* p=thelist;
for(;thelist!=NULL;p=thelist)
{
thelist=thelist->link;
delete p;
}
delete thelist;
}
template
std::ostream& operator << (std::ostream& out,const Polynominal& x)
{
x.Output(out);
return out;
}
template
std::istream& operator >> (std::istream& in,Polynominal& x)
{
x.Input(in);
return in;
}
int main()
{
Polynominal x;
Polynominal y;
Polynominal z;
cin>>x;
cin>>y;
z=x+y;
cout< system("pause");
}
阅读(1681) | 评论(0) | 转发(0) |