多项式类的复杂实现

#include<iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

class CPolynominal

{
public:

struct Node
{
    double coef;
    int exp;
    Node * next;
    Node(double  a,int b,Node* c=NULL):coef(a),exp(b),next(c){};
};
CPolynominal(){ head=new Node(0,0,NULL); }
CPolynominal(const CPolynominal &rhs);//复制构造函数
CPolynominal(double a[],int b[],int n);
~CPolynominal();
Node* get(int exp);
void sortnode();
void insertnode(double coef,int exp);
void removenode(int exp);
void modifynode(double newcoef,int exp);
double atnode(int exp);

//赋值运算符重载
CPolynominal& operator = (const CPolynominal &rhs);
CPolynominal& operator +=(const CPolynominal &rhs);
CPolynominal& operator -=(const CPolynominal &rhs);
CPolynominal& operator *=(const CPolynominal &rhs);

friend CPolynominal operator +(const CPolynominal &rhs,const CPolynominal &lhs);//重载+运算符
friend CPolynominal operator -(const CPolynominal &rhs,const CPolynominal &lhs);//重载-运算符
friend CPolynominal operator *(const CPolynominal &rhs,const CPolynominal &lhs);//重载*运算符

double ans(double x);
void   display()const;

private:
  Node* head;
};
/*****************************/

ostream& operator<<(ostream& os, const CPolynominal& rhs);
/*********************************/

void CPolynominal::display()const
{
    Node* p=head->next;
    while(p)
    {
        cout<<p->coef<<"x"<<"^"<<p->exp<<" ";
            p=p->next;
    }
   cout<<endl;
}
void CPolynominal:: sortnode()//可能有问题
{
    Node* q,*p,*m;
    //q=head->next;
    p=head->next;
    head->next=NULL;

       while(p)
   {
               q=p;
               p=p->next;
               m=head;
            while((m->next!=NULL)&&(q->exp<m->next->exp))
                 {
                     m=m->next;

                 }
                 if((m->next!=NULL)&&(q->exp==m->next->exp))
                 {
                     m->next->coef+=q->coef;
                     continue;
                 }

               q->next=m->next;
               m->next=q;

    }


}





double CPolynominal::ans(double x)
{
    Node*q=head->next;
    double sum=0.0;
    while(q)
    {
        sum+=q->coef*pow(x,q->exp);
        q=q->next;
    }

    return sum;
}
/******************************************/
CPolynominal:: ~CPolynominal()
{
    Node*q,*p;
    p=head->next;
    while(p)
    {
        q=p->next;
        if(p) delete p;
        p=q;
    }

}
CPolynominal:: CPolynominal(const CPolynominal &rhs)
{
    head=new Node(0,0,NULL);
    Node*q=head;
    for(Node*pt=rhs.head->next;pt;pt=pt->next)
    {
        q->next=new Node(pt->coef,pt->exp,NULL);
        q=q->next;
    }

}
/*******************************************************/
 CPolynominal:: CPolynominal (double a[],int b[],int n)
{
    head=new Node(0,0,NULL);
    Node* q=head;
    for(int i=0;i<n;i++)
    {
        q->next=new Node(a[i],b[i],NULL);
        q=q->next;
    }

}

 CPolynominal:: Node* CPolynominal::get(int exp)
{
    Node*q=head->next;
    while(q)
    {
        if(q->exp==exp)
        {
            return q;
        }
        q=q->next;
    }
    return q;
    //cout<<"ERROR"<<endl;


}
/***********************************/
void CPolynominal:: insertnode(double coef,int exp)
{
    Node*p=head;
    Node*q=p->next;
    Node*r=new Node(coef,exp,NULL);
   if(q==NULL)
     head->next=r;
   else
    {while(q)
     {
        if(exp>q->exp)
        {
            p->next=r;
            r->next=q;
            break;
        }
        if(exp==q->exp)
        {
            q->coef+=coef;
            break;
        }
        p=q;
        q=q->next;
     }
    }
}
void CPolynominal:: removenode(int exp)
{   Node*p=head;
    Node*q=p->next;
    int flag=1;
    while(q)
    {
        if(q->exp==exp)
        {
        p->next=q->next;
        delete q;
        flag=0;
        break;
        }
        p=q;
        q=q->next;
    }
    if(flag==1)
        cout<<"FIND ERROE"<<endl;

}
void CPolynominal:: modifynode(double newcoef,int exp)
{
    Node*q=head->next;
    int flag=1;
    while(q)
    {
        if(q->exp==exp)
        {
            q->coef=newcoef;
            flag=0;
            break;
        }
        q=q->next;
    }
    if(flag==1)
        cout<<"FIND ERROE"<<endl;

}
double CPolynominal:: atnode(int exp)
{
    Node*q=head->next;

    while(q)
    {
        if(q->exp==exp)
        {
            return q->coef;
        }
        q=q->next;

    }
    cout<<"FIND ERROR"<<endl;
}

/********************************************/
   CPolynominal  operator +(const CPolynominal &rhs,const  CPolynominal &lhs)
{
   CPolynominal rhs2(rhs);
   CPolynominal lhs2(lhs);
   CPolynominal:: Node*r,*q,*p;
    q=rhs2.head->next;p=lhs2.head->next;
    CPolynominal temp;
    r=temp.head;
    while(q&&p)
    {
           if(q->exp<p->exp)
           {r->next=p; r=p; p=p->next;}
          else if(q->exp==p->exp)
           {r->next=new CPolynominal:: Node(q->coef+p->coef,q->exp);r=r->next;p=p->next;}
          else if(q->exp>p->exp)
           {r->next=q; r=q; q=q->next;}
    }
     r->next=q?q:p;

     return temp;


}
 CPolynominal operator -(const CPolynominal &rhs,const  CPolynominal &lhs)//重载-运算符
 {
    CPolynominal temp1(lhs);
    CPolynominal temp2(rhs);
   CPolynominal:: Node* q=temp1.head->next;
   while(q)
   {
       q->coef=-q->coef;
       q=q->next;

   }

    temp2=temp2+temp1;
    return temp2;
 }
  CPolynominal operator *(const  CPolynominal &rhs,const CPolynominal &lhs)//有点问题
 {

      CPolynominal temp;
      CPolynominal:: Node *rcur,*lcur,*s;
      int e;
      double c;
      rcur=rhs.head->next;
      while (rcur)
      {
         lcur=lhs.head->next;
         while (lcur)
               {
               c=rcur->coef*lcur->coef;
               e=rcur->exp+lcur->exp;
               s=temp.get(e);//查temp中有无指数为e的项
               if (temp.head&&s)//temp中无指数为e的项
               s->coef+=c;
               else//temp中无指数为e的项
               temp.insertnode(c,e);
               lcur=lcur->next;
               }
        rcur=rcur->next;
       }
    return temp;


 }
 ostream& operator<<(ostream& os, const CPolynominal& rhs)
 {
    rhs.display();
    return os;
 }
 /*************************************/
CPolynominal& CPolynominal::operator = (const CPolynominal &rhs)
{
   Node*p=head;

  for(Node*q=rhs.head->next;q;q=q->next)
  {
      p->next=new Node(q->coef,q->exp,NULL);
      p=p->next;
  }

   return *this;
}
CPolynominal& CPolynominal:: operator +=(const CPolynominal &rhs)
{

 *this=*this+rhs;
  return *this;
}
/*CPolynominal& CPolynominal:: operator -=(const CPolynominal &rhs)
{

 *this=*this-rhs;

}*/
CPolynominal& CPolynominal:: operator *=(const CPolynominal&rhs)
{

 *this=*this*rhs;
  return *this;
}

int main()

{

    int    e1[5]={5,6,3,2,1};
    double c1[5]={1,2,3,4,5};
    int    e2[4]={6,7,8,9};
    double c2[4]={9,8,7,6};
    CPolynominal p1(c1,e1,5);
    CPolynominal p2(c2,e2,4);
    CPolynominal p3(p2);
    CPolynominal p4;
    p1.display();
    p2.display();
    p4=p1*p2;
    p1.display();
    p2.display();

    cout<<p4;
    //p1.sortnode();
    //p2.sortnode();
    //p1.sortnode();
   // p1.sortnode();
    /*p2.sortnode();
    p1.display();
    p2.display();
    CPolynominal p4=p1+p2;
    p4.display();
    p4.sortnode();
    p4.display();
    cout<<p4<<endl;*/
   // p4.display();
   /* p2.display();
    p3.display();
    p1.insertnode(7,8);
    p1.display();
    double i=p2.atnode(9);
    cout<<i<<endl;
    p3.modifynode(7,9);
    p3.display();
    CPolynominal p4;
    p4=p1;
    p4.display();*/
    return 0;


}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值