单链表的应用:多项式及其运算

Polynomial.h

#include<iostream>

#include<math.h>//fabs()
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&&current->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;

}


猜你喜欢

转载自blog.csdn.net/qq_38628659/article/details/80258253
今日推荐