|  | 
				
					
	
		
			
 			Posted on 2010-04-14 21:11 陈显锋  阅读(1328) 评论(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未} 
	    
    
 |