一元多项式计算实验报告(相加,相减,相乘)

一元多项式计算
任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减和相乘,并将结果输出;
在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
设有一元多项式Am(x)和Bn(x).
Am(x)=A0+A1x1+A2x2+A3x3+… +Amxm
Bn(x)=B0+B1x1+B2x2+B3x3+… +Bnxn
请实现求M(x)=Am(x)+Bn(x),M(x)=Am(x)-Bn(x)和M(x)=Am(x)×Bn(x)。
要求:

  1. 首先判定多项式是否稀疏(个人判定以系数为0的项数大于项的最大次数加+1除2)
  2. 分别采用顺序和动态存储结构实现;
  3. 结果M(x)中无重复阶项和无零系数项;
  4. 要求输出结果的升幂和降幂两种排列情况

#include <bits/stdc++.h>
using namespace std;
struct A//定义双向链表,方便降幂输出
{
    int a;
    int b;
    struct A*prior;
    struct A*next;
};
void paixu(struct A* head,struct A*p)//链表幂从小到大排序,进来一个排一个
{
    struct A*p1,*p2;
    int flag=0;
    if(head->next==NULL)
    {
        p->next=head->next;
        head->next=p;
    }
    else
    {
        p1=head;
        p2=head->next;
        while(p2!=NULL)
        {
            if(p->b<p2->b)
            {
                p1->next=p;
                p->next=p2;
                flag=1;
                break;
            }
            else if(p->b==p2->b)
            {
                p2->a+=p->a;
                flag=1;
                break;
            }
            else
            {
                p1=p2;
                p2=p2->next;
            }

        }
        if(flag==0)
        {
            p1->next=p;
            p->next=NULL;
        }
    }
}
void jia1(struct A*head1,struct A*head2,struct A*head3)//链表相加
{
    struct A*p1,*p2,*p3,*p;
    p1=head1->next;
    p2=head2->next;
    p3=head3;//有意思
    head3->next=NULL;//避免运行加减函数互相影响
    while(p1!=NULL&&p2!=NULL)
    {

        p=(struct A*)malloc(sizeof(struct A));
        p->next=NULL;
        if(p1->b==p2->b)
        {
            if(p1->a+p2->a!=0)//链表相加为0,直接不录入
            {
                p->a=p1->a+p2->a;
                p->b=p1->b;
                p3->next=p;
                p3=p;
            }
            p1=p1->next;
            p2=p2->next;
        }
        else if(p1->b<p2->b)
        {
            p->a=p1->a;
            p->b=p1->b;
            p3->next=p;
            p3=p;

            p1=p1->next;

        }
        else
        {
            p->a=p2->a;
            p->b=p2->b;
            p3->next=p;
            p3=p;

            p2=p2->next;
        }
    }

    if(p1==NULL)
    {
        while(p2!=NULL)
        {
            p=(struct A*)malloc(sizeof(struct A));
            p->next=NULL;
            p->a=p2->a;
            p->b=p2->b;
            p3->next=p;
            p3=p;
            p2=p2->next;
        }
    }
    else
    {
        while(p1!=NULL)
        {
            p=(struct A*)malloc(sizeof(struct A));
            p->next=NULL;
            p->a=p1->a;
            p->b=p1->b;
            p3->next=p;
            p3=p;
            p1=p1->next;
        }
    }
}
void jian1(struct A*head1,struct A*head2,struct A*head3)//链表相减,只需在加的基础上改+为-
{
    struct A*p1,*p2,*p3,*p;
    p1=head1->next;
    p2=head2->next;
    p3=head3;//有意思
     head3->next=NULL;//重要
    while(p1!=NULL&&p2!=NULL)
    {

        p=(struct A*)malloc(sizeof(struct A));
        p->next=NULL;
        if(p1->b==p2->b)
        {
            if(p1->a-p2->a!=0)
            {
                p->a=p1->a-p2->a;
                p->b=p1->b;
                p3->next=p;
                p3=p;
            }
            p1=p1->next;
            p2=p2->next;
        }
        else if(p1->b<p2->b)
        {
            p->a=-p1->a;
            p->b=p1->b;
            p3->next=p;
            p3=p;

            p1=p1->next;

        }
        else
        {
            p->a=-p2->a;
            p->b=p2->b;
            p3->next=p;
            p3=p;

            p2=p2->next;
        }
    }

    if(p1==NULL)
    {
        while(p2!=NULL)
        {
            p=(struct A*)malloc(sizeof(struct A));
            p->next=NULL;
            p->a=-p2->a;
            p->b=p2->b;
            p3->next=p;
            p3=p;
            p2=p2->next;
        }
    }
    else
    {
        while(p1!=NULL)
        {
            p=(struct A*)malloc(sizeof(struct A));
            p->next=NULL;
            p->a=-p1->a;
            p->b=p1->b;
            p3->next=p;
            p3=p;
            p1=p1->next;
        }
    }
}

int chen1(struct A*head1,struct A*head2,struct A*head3,struct A*head4,struct A*head5)//链表相乘,化为相加
{
    struct A*p1,*p2,*p3,*p4,*p5,*p;
    int i=1;
    p1=head1->next;
    while(p1!=NULL)
    {

        p2=head2->next;
        p5=head5->next;
        while(p2!=NULL)
        {
            p5->a=p1->a*p2->a;
            p5->b=p1->b+p2->b;
            p5=p5->next;
            p2=p2->next;
        }
        //head4,head3作为容器,进行连加,好像可以不用
        if(i==1)
        {
            jia1(head5,head4,head3);
            i=2;//标志
        }
        else
        {
            jia1(head5,head3,head4);
            i=1;//标志
        }
        p1=p1->next;

    }

    return i;//判断最后的容器是head3,还是head4;
}
void xishu(int a[],int max)//顺序存储判断稀疏
{
    int min=0;
   for(int i=0;i<=max;i++)
   {
       if(a[i]==0)
        min++;
   }
   if(min>(max+1)/2)
   cout<<"表达式稀疏"<<endl;
   else
   cout<<"表达式正常"<<endl;
}
void xishu1(struct A*head)//链式存储判断稀疏
{
    struct A*p;int i=0,max=0;
    p=head->next;
    while(p!=NULL)
    {   i++;
       if(max<p->b)
        max=p->b;
        p=p->next;
    }
    if(i<=(max+1)/2)
    cout<<"表达式稀疏"<<endl;
    else
     cout<<"表达式正常"<<endl;
}
void jia(int a[],int b[],int c[],int maxa,int maxb,int &maxc,int &flag)//顺序存储相加
{
    maxc=maxa>maxb?maxa:maxb;
    cout<<"顺序:";
    for(int i=0;i<=maxc;i++)//注意maxc包含在内
    {
        c[i]=a[i]+b[i];
        if(c[i]!=0)
         {cout<<c[i]<<"*x^"<<i<<" ";
          flag=1;}
    }
    if(flag==0)
      cout<<"0";
      cout<<endl;
      cout<<"逆序:";
       for(int i=maxc;i>=0;i--)//注意maxc包含在内
    {
        if(c[i]!=0)
         {cout<<c[i]<<"*x^"<<i<<" ";
          flag=1;}
    }

}
void jian(int a[],int b[],int c[],int maxa,int maxb,int &maxc,int &flag)//顺序存储相减
{
  maxc=maxa>maxb?maxa:maxb;
  cout<<"顺序:";
    for(int i=0;i<=maxc;i++)//注意maxc包含在内
    {
        c[i]=a[i]-b[i];
        if(c[i]!=0)
        {cout<<c[i]<<"*x^"<<i<<" ";
          flag=1;}
    }
     if(flag==0)
      cout<<"0";
      cout<<endl;
       cout<<"逆序:";
       for(int i=maxc;i>=0;i--)//注意maxc包含在内
    {
        if(c[i]!=0)
         {cout<<c[i]<<"*x^"<<i<<" ";
          flag=1;}
    }
}
void chen(int a[],int b[],int c[],int maxa,int maxb,int &maxc,int &flag)//顺序存储相乘
{
    for(int i=0;i<=maxa;i++)
    for(int j=0;j<=maxb;j++)
    {
        if(a[i]!=0&&b[j]!=0)
        {
            c[i+j]+=a[i]*b[j];
        }
    }
    cout<<"顺序:";
    for(int i=0;i<=maxa+maxb;i++)
    {
        if(c[i]!=0)
        {
            cout<<c[i]<<"*x^"<<i<<" ";
            flag=1;
        }
    }
    if(flag==0)
    cout<<"0";
    cout<<endl;
    cout<<"逆序:";
    for(int i=maxa+maxb;i>=0;i--)
    {
        if(c[i]!=0)
        {
            cout<<c[i]<<"*x^"<<i<<" ";
            flag=1;
        }
    }

}
int main()
{
    int n1,n2,e,f,maxa,maxb,maxc,sum,sum1,flag;
    int a[100],b[100],c[100];
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    maxa=maxb=maxc=0;
    char d;
    cout<<"请输入数字,数字1表示进行顺序存储,数字2表示进行动态存储"<<endl;
    cin>>sum;
    while(sum!=1&&sum!=2)
    {
        cout<<"输入错误,请输入数字,数字1表示进行顺序存储,数字2表示进行动态存储"<<endl;
        cin>>sum;
    }
    cout<<"输入成功"<<endl;
    if(sum==2)
    {
        struct A *head1,*head2,*p,*head3,*head4,*head5,*p1,*p2,*p3;
        head1=(struct A*)malloc(sizeof(struct A));
        head2=(struct A*)malloc(sizeof(struct A));
        head3=(struct A*)malloc(sizeof(struct A));
        head4=(struct A*)malloc(sizeof(struct A));
        head5=(struct A*)malloc(sizeof(struct A));
        head1->next=NULL;//有意思
        head2->next=NULL;
        head3->next=NULL;
        head4->next=NULL;
        head5->next=NULL;

        cout<<"请输入第一个表达式的项个数"<<endl;
        cin>>n1;
        while(n1<=0)
        {
            cout<<"请重新输入,输入值需大于0"<<endl;
            cin>>n1;
        }
         cout<<"输入成功"<<endl;
         cout<<"请输入第一个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
        for(int i=0; i<n1; i++)
        {
            cin>>e>>d>>f;
            p=(struct A*)malloc(sizeof(struct A));
            if(e!=0)
            {
                p->a=e;
                p->b=f;
                 paixu(head1,p);
            }

        }
        xishu1(head1);
        cout<<"请输入第二个表达式的项个数"<<endl;
        cin>>n2;
        while(n2<=0)
        {
            cout<<"请重新输入,输入值需大于0"<<endl;
            cin>>n2;
        }
         cout<<"输入成功"<<endl;
        cout<<"请输入第二个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
        p1=head5;
        for(int i=0; i<n2; i++)
        {
            cin>>e>>d>>f;
            p=(struct A*)malloc(sizeof(struct A));
            if(e!=0)
            {
                p->a=e;
                p->b=f;
                p2=(struct A*)malloc(sizeof(struct A));
                p2->next=NULL;
                p1->next=p2;
                p1=p2;
                paixu(head2,p);
            }

        }
         xishu1(head2);
        cout<<"输入1表示相加,输入2表示相减,输入3表示相乘"<<endl;
        cin>>sum1;
        while(sum1!=1&&sum1!=2&&sum1!=3)
        {
            cout<<"输入错误,请重新输入"<<endl;
            cin>>sum1;
        }
                cout<<"输入成功"<<endl;
        while(1)
        {
            flag=0;
        if(sum1==1)
        {
            jia1(head1,head2,head3);
            cout<<"顺序:";
            p=head3->next;
            p3=head3;
            while(p)
            {
                cout<<p->a<<"*x^"<<p->b<<" ";
                p->prior=p3;//顺便从后往前链接
                p3=p;
                p=p->next;
                flag=1;
            }
            if(flag==0)
            cout<<"0";
            cout<<endl;
            cout<<"逆序:";
            while(p3!=head3)
            {
                cout<<p3->a<<"*x^"<<p3->b<<" ";
                p3=p3->prior;
            }
            if(flag==0)
            cout<<"0";
            cout<<endl;
        }
        if(sum1==2)
        {

            jian1(head1,head2,head3);
            cout<<"顺序:";
            p=head3->next;
            p3=head3;
            while(p)
            {
                cout<<p->a<<"*x^"<<p->b<<" ";
                p->prior=p3;//顺便从后往前链接
                p3=p;
                p=p->next;
                flag=1;
            }
            if(flag==0)
            cout<<"0";
            cout<<endl;
            cout<<"逆序:";
            while(p3!=head3)
            {
                cout<<p3->a<<"*x^"<<p3->b<<" ";
                p3=p3->prior;
            }
            if(flag==0)
            cout<<"0";
            cout<<endl;

        }
        if(sum1==3)
        {
            if(chen1(head1,head2,head3,head4,head5)==2)
                {p=head3->next;p3=head3;}
            else
                {p=head4->next;p3=head4;}

             cout<<"顺序:";

            while(p)
            {
                cout<<p->a<<"*x^"<<p->b<<" ";
                p->prior=p3;//顺便从后往前链接
                p3=p;
                p=p->next;
                flag=1;
            }
            if(flag==0)
            cout<<"0";
            cout<<endl;
            cout<<"逆序:";
            if(chen1(head1,head2,head3,head4,head5)==2)
            while(p3!=head3)
            {
                cout<<p3->a<<"*x^"<<p3->b<<" ";
                p3=p3->prior;
            }
            else
             while(p3!=head4)
            {
                cout<<p3->a<<"*x^"<<p3->b<<" ";
                p3=p3->prior;
            }
            if(flag==0)
            cout<<"0";
            cout<<endl;

        }
       cout<<"输入1表示相加,输入2表示相减,输入3表示相乘,输入0结束"<<endl;
       cin>>sum1;
       while(sum1!=1&&sum1!=2&&sum1!=3&&sum1!=0)
       {
           cout<<"输入错误,请重新输入";
           cin>>sum1;
       }
      if(sum1==0)
       {
           cout<<"结束";
           break;
       }

    }
}
else
{
    cout<<"请输入第一个表达式的项个数"<<endl;
        cin>>n1;
        while(n1<=0)
        {
            cout<<"请重新输入,输入值需大于0"<<endl;
            cin>>n1;
        }
         cout<<"输入成功"<<endl;
         cout<<"请输入第一个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
    for(int i=0;i<n1;i++)
    {
        cin>>e>>d>>f;
        a[f]+=e;
        if(maxa<f)
        maxa=f;

    }
      xishu(a,maxa);
      cout<<"请输入第二个表达式的项个数"<<endl;
        cin>>n2;
        while(n2<=0)
        {
            cout<<"请重新输入,输入值需大于0"<<endl;
            cin>>n2;
        }
         cout<<"输入成功"<<endl;
        cout<<"请输入第二个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
    for(int i=0;i<n2;i++)
    {
        cin>>e>>d>>f;
        b[f]+=e;
        if(maxb<f)//检查相同的话
        maxb=f;

    }
     xishu(b,maxb);
       cout<<"输入1表示相加,输入2表示相减,输入3表示相乘"<<endl;
        cin>>sum1;
        while(sum1!=1&&sum1!=2&&sum1!=3)
        {
            cout<<"输入错误,请重新输入"<<endl;
            cin>>sum1;
        }
         cout<<"输入成功"<<endl;
         while(1)
         {   flag=0;
              if(sum1==1)
        {
          jia(a,b,c,maxa,maxb,maxc,flag);
          if(flag==0)
          cout<<"0";
          cout<<endl;
        }
        if(sum1==2)
        {
            jian(a,b,c,maxa,maxb,maxc,flag);
             if(flag==0)
          cout<<"0";
          cout<<endl;
        }
        if(sum1==3)
        {
           chen(a,b,c,maxa,maxb,maxc,flag);
         if(flag==0)
         cout<<"0";
          cout<<endl;
        }
         memset(c,0,sizeof(c));
         cout<<"输入1表示相加,输入2表示相减,输入3表示相乘,输入0结束"<<endl;
       cin>>sum1;
       while(sum1!=1&&sum1!=2&&sum1!=3&&sum1!=0)
       {
           cout<<"输入错误,请重新输入";
           cin>>sum1;
       }
       if(sum1==0)
       {
           cout<<"结束";
           break;
       }

         }

}
}

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实验一 线性表及其应用 一、 实验目的和要求 1、掌握线性表的插入、删除、查找等基本操作设计与实现 2、学习利用线性表提供的接口去求解实际问题 3、熟悉线性表的的存储方法 二、 实验内容和原理 1、实验内容:设计一个一元多项式的简单计算器,其基本功能有①输入并建立多项式;②输出多项式;③多项式相加。可利用单链表或单循环链表实现之。 2、实验原理:以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式中某一项的系数和指数,建立单链表时指数高的结点列于指数低的 结点之后,即线性表的元素按指数递增有序排列。 三、 实验环境 Visual C++ 6.0 及PC机 四、 算法描述及实验步骤 思想算法: 以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式中某一项的系数和指数,建立单链表时指数高的结点列于指数低的结点之后,即线性表的元素按指数递增有序排列。 例如构造两个多项式ha: 5X3+4X2+3X+2 hb: X2+X+1 多项式加法:定义指针p,q分别指向ha,hb i.p->exp==q->exp ,r->coef=p->coef+q->coef,pa,pb下移; ii.p->expexp ,r->coef=q->coef;r->exp=q->exp;,q下移 iii.pa->exp>pb->exp, r->exp=p->exp;r->coef=p->coef;,p下移 iv.p!=NULL,pb==NULL.相当于iii. V.q==NULL,pb!=NULL.相当于ii. 其流程图如下: 多项式乘法:定义指针fp,gp分别指向f,g 1.将两多项式最大指数相加并赋于maxp,并置g 2.用for循环求指数等于maxp时相乘的系数 3. (fp!=NULL)&&(gp!=NULL), p=fp->exp+gp->exp 1.p>maxp, fp=fp->next; 2. pnext; 3.p=maxp, x+=fp->coef*gp->coef; fp=fp->next;gp=gp->next; 五、 实验结果 1.分别输入两个多项式: 5X3+4X2+3X+2 和X2+X+1,然后输出结果如下: 2.分别输入两个多项式:6X4+4X2+2和5X+6,然后输出结果如下: 六、 总结 此次上机实验应用了线性表实现了一次实际操作,完成了一个一元多项式的简单计算器,不仅对此次编译程序的算法思想有了新的认识,还让我深刻的体会到了线性表的重要性以及其应用的方便,并且对指针加深了映象,应用了书本中的算法思想,对我以后的编译以及完成新的程序有很大的帮助。 附录: 1.建立多项式列表代码如下: mulpoly *creatpoly()/*建立多项式列表*/ {mulpoly *head,*r,*s;/*设中间变量*/ int m,n; head=(mulpoly *)malloc(sizeof(mulpoly));/*头结点申请空间*/ printf("\ninput coef and exp:\n"); scanf("%d%d",&n,&m);/*输入多项式系数和指数*/ r=head;/*尾指针指向头指针*/ while(n!=0)/*将输入的多项式存放在S中*/ {s=(mulpoly*)malloc(sizeof(mulpoly)); s->coef=n; s->exp=m; r->next=s; r=s; /*printf("input coef and exp:\n");*/ scanf("%d%d",&n,&m);/*再次输入多项式系数和指数*/ } r->next=NULL;/*将尾指针置空*/ head=head->next;/*将head哑结点向前跑一个结点,使其不为空*/ return (head);/*返回多项式*/ } 2.两个多项式相加代码如下: mulpoly *polyadd(mulpoly *ha,mulpoly *hb)/*两个多项式相加*/ {mulpoly *hc,*p,*q,*s,*r;/*声明结构体型*/ int x; p=ha; q=hb; hc=(mulpoly *)malloc(sizeof(mulpoly));/*申请结点空间*/ s=hc; while((p!=NULL)&&(q!=NULL))/*两多项式不为空*/

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值