|
Posted on 2010-04-14 21:11 陈显锋 阅读(1320) 评论(0) 编辑 收藏 引用 所属分类: 数据结构程序
#ifndef POLYNOMINAL_CLASS
#define POLYNOMINAL_CLASS

#include<iostream>
using namespace std;

class Term
  {
private:
int coef;
int exp;
Term* link;
public:
Term(int c, int e);
Term(int c, int e, Term* nxt);
Term* InsertAfter(int c, int e);
friend ostream& operator<<(ostream &,const Term &);
friend class Polynominal;
};

class Polynominal
  {
public:
Polynominal(void);
~Polynominal(void);
private:
Term* thelist;

public:
void AddTerms(istream& in);
void Output(ostream& out)const;
Polynominal& PolyAdd(Polynominal& r);
Polynominal& PolyMul(Polynominal& r);
Polynominal& operator=(Polynominal& r);
void PolyClear();
friend ostream& operator<<(ostream& out,const Polynominal& x);
friend istream& operator>>(istream& in, Polynominal& x);
friend Polynominal& operator + (Polynominal& a, Polynominal& b);
friend Polynominal& operator * (Polynominal& a, Polynominal& b);
};

#endif//POLYNOMINAL_CLASS

Term::Term(int c, int e)
  {
link=0;
}

Term::Term(int c, int e, Term* nex):coef(c),exp(e)
  {
link=nex;
}

Term* Term::InsertAfter(int c, int e)
  {
link=new Term(c,e,link);
return link;
}


ostream &operator <<(ostream& out,const Term& val)
  {
if(val.coef==0)
return out;
out<<val.coef;
 switch(val.exp) {
case 0:break;
case 1:out<<"x";break;
default:out<<"x^"<<val.exp;break;
}
return out;
}
Polynominal& Polynominal::operator=(Polynominal& r)
  {
this->PolyClear();
Term* q=thelist->link,* p;
for(p=r.thelist->link;p->exp>=0;p=p->link)
q=q->InsertAfter(p->exp,p->coef);
return *this;

}
Polynominal::Polynominal(void)
  {
thelist=new Term(0,-1);
thelist->link=thelist;
}

Polynominal::~Polynominal(void)
  {
Term* p=thelist->link;
 while(p!=thelist) {
thelist->link=p->link;
delete p;
p=thelist->link;
}
delete thelist;
}

void Polynominal::PolyClear()
  {
Term* p=thelist->link;
 while(p->exp>=0) {
thelist->link=p->link;
delete p;
p=thelist->link;
}
}

void Polynominal::AddTerms(istream& in)
  {
Term* q=thelist;
int c,e;
for(;;)
 {
cout<<"Input a term(coef,exp):";
cin>>c>>e;
if(e<0) break;
q=q->InsertAfter(c,e);
}
}

void Polynominal::Output(ostream& out)const
  {
int first=1;Term* p=thelist->link;
for(;p!=thelist;p=p->link)
 {
if(!first&&(p->coef>0)) out<<"+";
first=0;
cout<<*p;
}
}

Polynominal& Polynominal::PolyAdd(Polynominal& r)
  {
Term *q,*q1=thelist,*p;
p=r.thelist->link;
q=q1->link;
 while(p->exp>=0) {
 while(p->exp<q->exp) {
q1=q;q=q->link;
}
 if(p->exp==q->exp) {
q->coef=q->coef+p->coef;
 if(q->coef==0) {
q1->link=q->link;
delete (q);
q=q1->link;
}
 else {
q1=q;q=q->link;
}
}
else
q1=q1->InsertAfter(p->coef,p->exp);
p=p->link;
}
return *this;
}

Polynominal& Polynominal::PolyMul(Polynominal& r)
  {
Term *q,*p;
Polynominal *temp=new Polynominal,*t=new Polynominal;Term* qq;
for(p=r.thelist->link;p->exp>=0;p=p->link)
 {
 for(q=thelist->link,qq=temp->thelist->link;q->exp>=0;q=q->link) {
qq=qq->InsertAfter(q->coef*p->coef,p->exp+q->exp);
}
t->PolyAdd(*temp);
temp->PolyClear();
}
return *t;
}

ostream& operator<<(ostream& out,const Polynominal& x)
  {
x.Output(out);return out;
}

istream& operator>>(istream& in, Polynominal& x)
  {
x.AddTerms(in);return in;
}

Polynominal& operator + (Polynominal& a, Polynominal& b)
  {
return a.PolyAdd(b);
}

Polynominal& operator * (Polynominal& a, Polynominal& b)
  {
return a.PolyMul(b);
}
#include"Polynominal.h"
#include<iostream>
using namespace std;

int main()
  {
Polynominal p,q,r;
cin>>p;
cin>>q;
cout<<"测试结果如下:"<<endl;
cout<<"p*q="<<p*q<<endl;
cout<<"p+q="<<p+q<<endl未}
|