多项式的链表实现

实现多项式的输入、输出、加法、求导、求值。

using namespace std;
#include <stdlib.h>
#include <cmath>
#include <iostream>
#include "stdio.h"
using namespace std;
struct LinkNode       //多项式结点
{
    int  E;       //指数
    int A;        //系数
    LinkNode *link;    //结点指针
    LinkNode(float a,int e,LinkNode *p=NULL)     //构造函数
    {
        E=e;
        A=a;
        link=p;
    }
};

class Poly                //多项式类
{
private:
    LinkNode *first;     //首结点地址
public:
    Poly()
    {
        first=new LinkNode(0,-1);   //构造函数
    }
    Poly(Poly &p);    //复制构造函数
    Poly &operator=(Poly &p);    //赋值函数
    ~Poly()
    {
        makeEmpty();   //析构函数
    }
    int Max1();      //返回最大指数
    int Length();   //返回多项式长度
    void makeEmpty();      //清空链表中的元素
    void Input(int flag);      //输入函数
    void Output();      //输出函数
    void operator+(Poly &b);//多项式相加
    void operator-(Poly &b); //多项式相减
    void operator*(Poly &b);  //多项式相乘
    friend void  der(Poly l);   //多项式导数
    friend void cal(Poly l,int z);    //算值
};


void cal(Poly l,int z)
{
    LinkNode *p=l.first->link;
    int  count1=0;
    int  y=z;
    while(p!=NULL)
    {
        int x=p->A;
        while(p->E--)
        {
            x*=y;
        }
        count1+=x;
        p=p->link;
    }
    cout<<count1<<endl;
}
void Poly::makeEmpty()
{
    LinkNode *p=NULL;
    while(first->link!=NULL)
    {
        p=first->link;
        first->link=p->link;
        delete p;
    }
}

Poly::Poly(Poly &p)
{
    first=new LinkNode(0,-1);
    LinkNode *tem=first;
    int a;
    int e;
    LinkNode *ptr=p.first;
    while(ptr->link!=NULL)
    {
        a=ptr->link->A;
        e=ptr->link->E;
        tem->link=new LinkNode(a,e);
        ptr=ptr->link;
        tem=tem->link;
    }
}

Poly& Poly::operator=(Poly &p)
{
    first=new LinkNode(0,-1);
    LinkNode *tem=first;
    int a;
    int e;
    LinkNode *ptr=p.first;
    while(ptr->link!=NULL)
    {
        a=ptr->link->A;
        e=ptr->link->E;
        tem->link=new LinkNode(a,e);
        ptr=ptr->link;
        tem=tem->link;
    }
    return *this;
}

void Poly::Input(int flag)
{
    LinkNode *p=this->first;
    int a;
    int b;
    while(flag--)
    {
        cin>>a>>b;
        if(fabs(a)<=1e-7||b==-1)
        {
            continue;
        }
        if(b==-11)
        {
            break;
        }
        p->link=new LinkNode(a,b);
        p=p->link;
    }
}

int Poly::Max1()
{
    LinkNode *ptr=first;  //若为first-link,则最后一个为null,
    //null->E不存在
    while(ptr->link!=NULL)
    {
        ptr=ptr->link;
    }
    return ptr->E;
}

int Poly::Length()
{
    LinkNode *ptr=this->first;
    int count1=0;
    while(ptr->link!=NULL)
    {
        count1++;
        ptr=ptr->link;
    }
    return count1;
}

void Poly::Output()
{
    LinkNode *p1=this->first->link;
    if(p1->A>0)
    {
        if(p1->A!=1)
        {
            cout<<p1->A;
            if(p1->E==1)   cout<<"X";
            else if(p1->E>1)  cout<<"X^"<<p1->E;
        }
        else
        {
            if(p1->E==1)   cout<<"X";
            else if(p1->E>1)  cout<<"X^"<<p1->E;

        }
    }
    else if(p1->A<0)
    {
        cout<<p1->A;
        if(p1->E==1) cout<<"X";
        else if(p1->E>1)  cout<<"X^"<<p1->E;
    }
    p1=p1->link;
    while(p1!=NULL)
    {
        if(p1->A>=2)
        {
            cout<<"+"<<p1->A;
            if(p1->E==1)   cout<<"X";
            else if(p1->E>1)  cout<<"X^"<<p1->E;
        }
        else if(p1->A==1)
        {
            cout<<"+";
            if(p1->E==1)   cout<<"X";
            else if(p1->E>1)  cout<<"X^"<<p1->E;
        }
        else if(p1->A<0)
        {
            cout<<p1->A;
            if(p1->E==1) cout<<"X";
            else if(p1->E>1)  cout<<"X^"<<p1->E;
        }
        p1=p1->link;
    }
    cout<<endl;
}

void Poly::operator+(Poly &b)
{
    Poly temp;
    LinkNode *pa=first->link;
    LinkNode *pb=b.first->link;
    LinkNode *pc=temp.first;
    LinkNode *ptr=NULL;
    float f;
    while(pa!=NULL&&pb!=NULL)
    {
        if(pa->E==pb->E)
        {
            f=pa->A+pb->A;
            if(fabs(f)>1e-2)
            {
                pc->link=new LinkNode(f,pa->E);
                pc=pc->link;
            }
            pa=pa->link;
            pb=pb->link;
        }
        else if(pa->E>pb->E)
        {
            pc->link=new LinkNode(pb->A,pb->E);
            pc=pc->link;
            pb=pb->link;
        }
        else
        {
            pc->link=new LinkNode(pa->A,pa->E);
            pc=pc->link;
            pa=pa->link;
        }
    }
    if(pa!=NULL) ptr=pa;
    else ptr=pb;
    while(ptr!=NULL)
    {

        pc->link=new LinkNode(ptr->A,ptr->E);
        pc=pc->link;
        ptr=ptr->link;

    }
    temp.Output();
}

void Poly::operator-(Poly &b)
{
    Poly temp;
    LinkNode *ptr=NULL;
    LinkNode *pa=this->first->link;
    LinkNode *pb=b.first->link;
    LinkNode *pc=temp.first;
    float f;
    int flag=1;
    while(pa!=NULL&&pb!=NULL)
    {
        if(pa->E==pb->E)
        {
            f=pa->A-pb->A;
            if(fabs(f)>1e-2)
            {
                pc->link=new LinkNode(f,pa->E);
                pc=pc->link;
            }
            pa=pa->link;
            pb=pb->link;
        }
        else if(pa->E>pb->E)
        {
            pc->link=new LinkNode(-(pb->A),pb->E);
            pc=pc->link;
            pb=pb->link;
        }
        else
        {
            pc->link=new LinkNode(pa->A,pa->E);
            pc=pc->link;
            pa=pa->link;
        }
    }
    if(pa==NULL)
    {
        ptr=pb;
        flag=0;
    }
    else ptr=pa;
    while(ptr!=NULL)
    {
        if(flag==1)
            pc->link=new LinkNode(ptr->A,ptr->E);
        else
            pc->link=new LinkNode(-(ptr->A),ptr->E);
        ptr=ptr->link;
        pc=pc->link;
    }
    temp.Output();
}

void Poly::operator*(Poly &b)
{
    int ma=this->Max1();
    int mb=b.Max1();
    int k;
    int max1=ma+mb;
    Poly temp;
    LinkNode *pa=this->first->link;

    LinkNode *pc=temp.first;
    if(ma!=-1&&mb!=-1)
    {
        float *f=new float[ma+mb+1];
        for(int i=0; i<=max1; i++)  f[i]=0;
        while(pa!=NULL)
        {
            LinkNode *pb=b.first->link;
            while(pb!=NULL)
            {
                k=pa->E+pb->E;
                f[k]=f[k]+(pa->A)*(pb->A);
                pb=pb->link;
            }
            pa=pa->link;
        }
        for(int i=0; i<=max1; i++)
        {
            if(fabs(f[i])>0.01)
            {
                pc->link=new LinkNode(f[i],i);
                pc=pc->link;
            }
        }
        delete []f;
    }
    pc->link=NULL;
    temp.Output();
}

void der(Poly l)
{
    Poly temp;
    LinkNode *p=l.first->link;
    LinkNode *ptr=temp.first;
    while(p!=NULL)
    {
        if((p->E)>0)
        {
            float f=p->A*p->E;
            int e=p->E-1;
            ptr->link=new LinkNode(f,e);
            ptr=ptr->link;
        }
        p=p->link;
    }
    temp.Output();
}
int main()
{
    Poly x;
    int a;
    cin>>a;
    x.Input(a);
    Poly y;
    cin>>a;
    y.Input(a);
    cout<<"A(x)+B(x)=";
    x+y;
    cout<<"A'(x)=";
    der(x);
    cout<<"A(1)=";
    cin>>a;
    cal(x,a);
    return 0;
}

你可能感兴趣的:(数据结构,链表,多项式)