线性表ADT应用:一元多项式的处理

3 篇文章 0 订阅

线性表ADT应用:一元多项式的处理

符号处理是一类非数值性问题,一元多项式就是符号处理的一类实例。一个一元n次多项式的一般形式如下:

Pn(x) = p1Xe1 + p2Xe2 +…+ pmXem
其中 p1,p2,…, pm为各项的系数,非零;
e1,e2,…, em 为各项的指数,满足0<e1 <e2 <… <em,即按指数升序

现要求在计算机中存储这样的多项式,并能对它们进行处理。除了输入、输出外,还应包括加法、减法、乘法等等操作。

注:存储结构可以采用顺序存储结构(只存储系数方式、存储系数和指数方式)、链式存储结构(单链、循环单链、双链、循环双链),自己确定存储方案并在代码的前面用注释说明。

程序实现时采用菜单控制,通过菜单符号选择要执行的操作。

  1. 创建多项式C :分别创建两个多项式A(x)和B(x),其中 输入时按照 指数的升序顺序输入多项式每一项的系数和指数,系数为0表示多项式结束。

    例如:输入 :

1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 0

则创建多项式分别为:

A(x)=x2+3x4+5x6+7x8
B(x)=2x3+4x5+6x^7

  1. 多项式加法P:计算C(x) = A(x) + B(x),并输出C(x)

  2. 多项式减法S: 计算C(x) = A(x) - B(x),并输出C(x)

  3. 多项式乘法M: 计算C(x) = A(x) * B(x),并输出C(x)

  4. 求导数D: 计算C(x) = A’(x),并输出C(x)

  5. 求值V:计算x=x0时 多项式的值 A(x0),并输出(保留两位小数)。其中x0是输入的一个 float型数

  6. 多项式置空F:清空A(x)、B(x)、C(x)三个多项式,释放空间

  7. 退出X: 结束操作

测试用例
粘贴的时候总是有错误

#include "stdlib.h"
#include "iostream"
#include <cmath>
#include <iomanip>
using namespace std ;
class List; //前视定义,否则友元无法定义
struct xiang
{
    int zhi;
    int xi;
};
class LinkNode
{
    friend  List; //链表结点类的定义


public:
    LinkNode *link;
    int data;
    int zhishu;
    LinkNode(const int & item,const int & item2, LinkNode *ptr = NULL)
    {
        data=item;
        zhishu=item2;
        link=ptr;
    }

    LinkNode (LinkNode *ptr = NULL)
    {
        link=ptr;
    }
    ~LinkNode() {};

};

class List
{
    //单链表类的定义

public:
    LinkNode *first; //指向首结点的指针
    List ()
    {
        first = new LinkNode ();   // 带头结点
    }
    ~List ()
    {
        MakeEmpty();   //析构函数
    }
    void MakeEmpty ( );      //链表置空
    void input(int endtag);
    void output();
    //static void plusit(List A,List B,List* C);          //+
    static void jianfa(List A,List B,List* C);

};
void List:: MakeEmpty ( )
{
    LinkNode *q;
    while (  first->link != NULL )
    {
        q = first->link;
        first->link = q->link;
        delete q;
    }
};

//输入
void List::input(int endtag)
{
    LinkNode *newnode,*r;
    int val1,val2;
    first=new LinkNode();

    if(first==NULL)
    {
        cerr<<"存储分配错误!"<<endl;
        exit(1);
    }
    cin>>val1;    //读入元素
    r=first;  //r总指向目前链表的最后一个节点
    while(val1!=endtag)
    {
        cin>>val2;
        newnode=new LinkNode(val1,val2);
        r->link=newnode;
        r=newnode;
        cin>>val1;

    }
    r->link=NULL;
}


void List ::output()
{
    LinkNode *q = first->link;
    int flag=0;
    while(q != NULL)
    {
        if(q== first->link)      //第一个数字的系数不需要加符号
        {
            if(q->data==1)         //-----如果第一个系数是1
            {
                if(q->zhishu==0)    //指数为0时,只输出这个1
                {
                    cout<<"1";
                    flag=1;
                }
                else
                {
                    cout<<"x^"<<q->zhishu;
                    flag=1;
                    q = q->link;
                    continue;
                }
            }
            if(q->data==0)           //----如果系数是零,不用输出
            {

            }
            else                       //----不是零也不是1的,正常输出
            {
                if(q->zhishu==0)
                {
                    cout<<q->data;
                    flag=1;

                }
                else
                {
                    cout<<q->data<<"x^"<<q->zhishu;
                    flag=1;
                    q = q->link;
                    continue;
                }

            }
        }
        else
        {
            if(q->data>0)                  //出了第一项的,其他的要加符号
            {
                if(q->data==1)              //---第一项是1
                {

                    cout<<"+x^"<<q->zhishu;
                    flag=1;
                }
                else
                {
                    cout<<"+"<<q->data<<"x^"<<q->zhishu;
                    flag=1;
                }
            }
            else if(q->data<0)
            {
                cout<<q->data<<"x^"<<q->zhishu;
                flag=1;
            }
            else if(q->data==0)
            {

            }

        }
        q = q->link;
    }
    if(flag==0)
        cout<<"0";
    cout<<endl;
}

int main()
{
    int endtag=0;
    List A,B;
    List C,D,E,F;
    char v;
    cin>>v;
    if(v=='C')
    {
        A.input(endtag);
        B.input(endtag);
        //A.output();
        // B.output();
    }
    while(1)
    {
        cin>>v;
        if(v=='X')
        {
            break;
        }
        if(v=='P')               //加法
        {
            LinkNode *newnode;
            LinkNode *p2,*q2,*j;
            p2=A.first->link;
            q2=B.first->link;
            j=C.first;
            while(p2!=NULL || q2!=NULL)
            {
                if(p2!=NULL && q2!=NULL)
                {
                    if(p2->zhishu==q2->zhishu)
                    {
                        newnode=new LinkNode();
                        newnode->zhishu=p2->zhishu;
                        newnode->data=(p2->data)+(q2->data);
                        j->link=newnode;
                        j=newnode;
                        p2=p2->link;
                        q2=q2->link;
                        continue;
                    }
                    if(p2->zhishu>q2->zhishu)
                    {
                        newnode=new LinkNode();
                        newnode->zhishu=q2->zhishu;
                        newnode->data=q2->data;
                        j->link=newnode;
                        j=newnode;
                        q2=q2->link;
                        continue;
                    }
                    if(p2->zhishu<q2->zhishu)
                    {
                        newnode=new LinkNode();
                        newnode->zhishu=p2->zhishu;
                        newnode->data=p2->data;
                        j->link=newnode;
                        j=newnode;
                        p2=p2->link;
                        continue;
                    }
                }
                else if(p2==NULL)
                {
                    newnode=new LinkNode();
                    newnode->zhishu=q2->zhishu;
                    newnode->data=q2->data;
                    j->link=newnode;
                    j=newnode;
                    q2=q2->link;
                    continue;
                }
                else if(q2==NULL)
                {
                    newnode=new LinkNode();
                    newnode->zhishu=p2->zhishu;
                    newnode->data=p2->data;
                    j->link=newnode;
                    j=newnode;
                    p2=p2->link;
                    continue;
                }
            }
            cout<<"C(x)=";
            C.output();
            free(p2);
            free(q2);

        }
        if(v=='S')
        {
            LinkNode *newnode;
            LinkNode *p,*q,*j;
            p=A.first->link;
            q=B.first->link;
            j=D.first;
            while(p!=NULL || q!=NULL)
            {
                if(p!=NULL && q!=NULL)
                {
                    if(p->zhishu==q->zhishu)
                    {
                        newnode=new LinkNode();
                        newnode->zhishu=p->zhishu;
                        newnode->data=(p->data)-(q->data);
                        j->link=newnode;
                        j=newnode;
                        p=p->link;
                        q=q->link;
                        continue;
                    }
                    if(p->zhishu>q->zhishu)
                    {
                        newnode=new LinkNode();
                        newnode->zhishu=q->zhishu;
                        newnode->data=-(q->data);
                        j->link=newnode;
                        j=newnode;
                        q=q->link;
                        continue;
                    }
                    if(p->zhishu<q->zhishu)
                    {
                        newnode=new LinkNode();
                        newnode->zhishu=p->zhishu;
                        newnode->data=p->data;
                        j->link=newnode;
                        j=newnode;
                        p=p->link;
                        continue;
                    }
                }
                else if(p==NULL)
                {
                    newnode=new LinkNode();
                    newnode->zhishu=q->zhishu;
                    newnode->data=-(q->data);
                    j->link=newnode;
                    j=newnode;
                    q=q->link;
                    continue;
                }
                else if(q==NULL)
                {
                    newnode=new LinkNode();
                    newnode->zhishu=p->zhishu;
                    newnode->data=p->data;
                    j->link=newnode;
                    j=newnode;
                    p=p->link;
                    continue;
                }
            }
            cout<<"C(x)=";
            D.output();
            free(p);
            free(q);

        }
        if(v=='M')
        {
            int is0=0;
            xiang xiangshu[100];
            int k=0,flag=-1;
            LinkNode *p3,*q3;
            p3=A.first->link;
            q3=B.first->link;
            while(p3!=NULL)
            {
                q3=B.first->link;
                while(q3!=NULL)
                {
                    flag=-1;
                    for(int i=0; i<k; i++)
                    {
                        if(xiangshu[i].zhi==(p3->zhishu)+(q3->zhishu))
                        {
                            xiangshu[i].xi=xiangshu[i].xi+((p3->data)*(q3->data));
                            flag=1;
                            break;
                        }
                    }
                    if(flag==-1)
                    {
                        xiangshu[k].xi=(p3->data)*(q3->data);
                        xiangshu[k].zhi=(p3->zhishu)+(q3->zhishu);
                        k++;
                    }
                    q3=q3->link;
                }
                p3=p3->link;
            }
            //排序
            xiang t;
            for(int i=0; i<k; i++)
            {
                for(int j=i+1; j<k; j++)
                {
                    if(xiangshu[i].zhi>xiangshu[j].zhi)
                    {
                        t=xiangshu[i];
                        xiangshu[i]=xiangshu[j];
                        xiangshu[j]=t;
                    }
                }
            }
            cout<<"C(x)=";
            for(int i=0; i<k; i++)
            {
                if(i==0)
                {
                    if(xiangshu[i].xi==1)
                    {
                        if(xiangshu[i].zhi==1)
                        {
                            cout<<"x";
                            is0=1;
                        }
                        else
                        {
                            cout<<"x^"<<xiangshu[i].zhi;
                            is0=1;
                        }

                    }
                    else
                    {
                        if(xiangshu[i].zhi==1)
                        {
                            cout<<xiangshu[i].xi<<"x";
                            is0=1;
                        }
                        else
                        {
                            cout<<xiangshu[i].xi<<"x^"<<xiangshu[i].zhi;
                            is0=1;
                        }
                    }
                }
                else
                {
                    if(xiangshu[i].xi>0)
                    {
                        if(xiangshu[i].xi==1)
                        {
                            if(xiangshu[i].zhi==1)
                            {
                                cout<<"+x";
                                is0=1;
                            }
                            else
                            {
                                cout<<"+x^"<<xiangshu[i].zhi;
                                is0=1;
                            }

                        }
                        else
                        {
                            if(xiangshu[i].zhi==1)
                            {
                                cout<<"+"<<xiangshu[i].xi<<"x";

                                is0=1;
                            }
                            else
                            {
                                cout<<"+"<<xiangshu[i].xi<<"x^"<<xiangshu[i].zhi;
                                is0=1;
                            }
                        }
                    }
                    else if(xiangshu[i].xi<0)
                    {
                        if(xiangshu[i].zhi==1)
                        {
                            cout<<xiangshu[i].xi<<"x";
                            is0=1;
                        }
                        else
                        {
                            cout<<xiangshu[i].xi<<"x^"<<xiangshu[i].zhi;
                            is0=1;
                        }
                    }
                }

            }
            if(is0==0)
                cout<<"0";           cout<<endl;

        }
        if(v=='D')
        {
            int is00=0;
            int jishu=0;
            xiang qiudao[100];
            LinkNode *p4;
            p4=A.first->link;
            while(p4!=NULL)
            {
                if(p4->zhishu==0)
                {
                     p4=p4->link;
                }
                else
                {
                    qiudao[jishu].xi=(p4->data)*(p4->zhishu);
                    qiudao[jishu].zhi=(p4->zhishu)-1;
                    jishu++;
                    p4=p4->link;
                }

            }
            cout<<"C(x)=";
            for(int i=0; i<jishu; i++)
            {
                if(i==0)
                {
                    if(qiudao[i].xi==1)
                    {
                        if(qiudao[i].zhi==1)
                        {
                            cout<<"x";
                            is00=1;
                        }
                        else if(qiudao[i].zhi==0)
                        {
                            cout<<"1";
                            is00=1;
                        }
                        else
                        {
                            cout<<"x^"<<qiudao[i].zhi;
                            is00=1;
                        }

                    }
                    else if(qiudao[i].xi==0)
                    {

                    }
                    else
                    {
                        if(qiudao[i].zhi==1)
                        {
                            cout<<qiudao[i].xi<<"x";
                            is00=1;
                        }
                        else if(qiudao[i].zhi==0)
                        {
                            cout<<qiudao[i].xi;
                            is00=1;
                        }
                        else
                        {
                            cout<<qiudao[i].xi<<"x^"<<qiudao[i].zhi;
                            is00=1;
                        }
                    }
                }
                else
                {
                    if(qiudao[i].xi>0)
                    {
                        if(qiudao[i].xi==1)
                        {
                            if(qiudao[i].zhi==1)
                            {
                                cout<<"+x";
                                is00=1;
                            }
                            else if(qiudao[i].zhi==0)
                            {
                                cout<<"1";
                                is00=1;
                            }
                            else
                            {
                                cout<<"+x^"<<qiudao[i].zhi;
                                is00=1;
                            }

                        }
                        else
                        {
                            if(qiudao[i].zhi==1)
                            {
                                cout<<"+"<<qiudao[i].xi<<"x";
                                is00=1;
                            }
                            else if(qiudao[i].zhi==0)
                            {
                                cout<<"+"<<qiudao[i].xi;
                                is00=1;
                            }
                            else
                            {
                                cout<<"+"<<qiudao[i].xi<<"x^"<<qiudao[i].zhi;
                                is00=1;
                            }
                        }
                    }
                    else if(qiudao[i].xi<0)
                    {
                        if(qiudao[i].zhi==1)
                        {
                            cout<<qiudao[i].xi<<"x";
                            is00=1;
                        }
                        else if(qiudao[i].zhi==0)
                        {
                            cout<<qiudao[i].xi;
                            is00=1;
                        }
                        else
                        {
                            cout<<qiudao[i].xi<<"x^"<<qiudao[i].zhi;
                            is00=1;
                        }
                    }
                    else if(qiudao[i].xi==0)
                    {

                    }
                }

            }
            if(is00==0)
                cout<<"0";
            cout<<endl;

        }
        if(v=='V')
        {
            float com,sum=0;
            cin>>com;
            LinkNode *p5;
            p5=A.first->link;
            while(p5!=NULL)
            {
                sum=sum+(p5->data)*pow(com,p5->zhishu);
                p5 = p5->link;
            }
            cout<<fixed<<setprecision(2)<<sum<<endl;
        }
        if(v=='C')
        {
            A.MakeEmpty();
            B.MakeEmpty();
            C.MakeEmpty();
            D.MakeEmpty();
        }

    }

    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值