实验项目3-4:一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式说明:

输入分2行。每行分别先给出多项式非零项的个数。再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式说明:

输出分2行。分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。

数字间以空格分隔,但结尾不能有多余空格。

例子输入与输出:

这里写图片描述

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct node{
    int cofi;
    int index;
    struct node *next;
}list;
list * create()
{
    list *p,*r,*q;
    int a[MAX],N,i;
    scanf("%d",&N);
    p=(list *)malloc(sizeof(list));
    p->next=NULL;
    q=p;
    for(i=0;i<2*N;i=i+2)
        scanf("%d %d",&a[i],&a[i+1]);
    for(i=0;i<2*N;i=i+2)
    {
        r=(list *)malloc(sizeof(list));
        r->cofi=a[i];
        r->index=a[i+1];
        r->next=NULL;
        q->next=r;
        q=r;
    }
    return p;
}
list *add(list* l1,list *l2)
{
    list * q1,*q2,*p,*q,* r;
    q1=l1->next;
    q2=l2->next;
    p=(list *)malloc(sizeof(list));
    p->next=NULL;
    q=p;
    while(q1!=NULL||q2!=NULL)
    {
        if(q1!=NULL&&q2!=NULL)  //两者都不为空
        {
            if(q1->index>q2->index)
            {
                r=(list *)malloc(sizeof(list));
                r->cofi=q1->cofi;
                r->index=q1->index;
                r->next=NULL;
                q->next=r;
                q=r;
                q1=q1->next;
            }
            else if(q1->index<q2->index)
            {
                r=(list *)malloc(sizeof(list));
                r->cofi=q2->cofi;
                r->index=q2->index;
                r->next=NULL;
                q->next=r;
                q=r;
                q2=q2->next;
            }
            else
            {
                if((q1->cofi+q2->cofi)!=0)
                {
                    r=(list *)malloc(sizeof(list));
                    r->cofi=q1->cofi+q2->cofi;
                    r->index=q1->index;
                    r->next=NULL;
                    q->next=r;
                    q=r;
                    q1=q1->next;
                    q2=q2->next;
                }
                else      //系数为0,跳过
                {
                    q1=q1->next;
                    q2=q2->next;
                }
            }
        }
        else if(q1!=NULL&&q2==NULL)// 其中q2为空
        {
            r=(list *)malloc(sizeof(list));
            r->cofi=q1->cofi;
            r->index=q1->index;
            r->next=NULL;
            q->next=r;
            q=r;
            q1=q1->next;
        } 
        else //                   其中q1为空
        {
            r=(list *)malloc(sizeof(list));
            r->cofi=q2->cofi;
            r->index=q2->index;
            r->next=NULL;
            q->next=r;
            q=r;
            q2=q2->next;
        }

    }
    return p;
}
list *insert(list *l1,list *l2)//将l2插入l1中,返回l1
{
    list * q1,*q2,* r;
    int flag;
    for(q2=l2->next;q2!=NULL;q2=q2->next)
    {
        flag=1;
        q1=(list *)malloc(sizeof(list));
        q1=l1;
        while(q1->next!=NULL)
        {
           if(q2->index>q1->next->index)
           {
               r=(list *)malloc(sizeof(list));
               r->cofi=q2->cofi;
               r->index=q2->index;
               r->next=q1->next;
               q1->next=r;
                flag=0;
               break;   //插入后退出,继续插下一个
           }
           else if(q2->index==q1->next->index)
           {
               if((q1->next->cofi+q2->cofi)!=0)
               {
                     q1->next->cofi=q1->next->cofi+q2->cofi;
                      flag=0;
                     break;
               }
               else
               {
                  r=(list *)malloc(sizeof(list));
                  r=q1->next;
                  q1->next=r->next;
                  free(r);
                   flag=0;
                  break;
               }
           }
           else
             q1=q1->next;//比当前指数小,和下一个比较
        }
        if(flag==1)//flag是标志位,如果flag=1,表示没执行插入,插在l1末尾
        {
            r=(list *)malloc(sizeof(list));
            r->cofi=q2->cofi;
            r->index=q2->index;
            r->next=q1->next;
            q1->next=r;
        }
    }
    return l1;
}
list *multiply(list *l1,list *l2)
{
    list * q1,*q2,*p,*q,*r,*l3;
    l3=(list *)malloc(sizeof(list));
    l3->next=NULL;
    for(q1=l1->next;q1!=NULL;q1=q1->next)
    {
        p=(list *)malloc(sizeof(list));
        p->next=NULL;
        q=p;
        for(q2=l2->next;q2!=NULL;q2=q2->next)
        {
            r=(list *)malloc(sizeof(list));
            r->cofi=q1->cofi*q2->cofi;
            r->index=q1->index+q2->index;
            r->next=NULL;
            q->next=r;
            q=r;
        }
        l3=insert(l3,p);
    }
    return l3;
}

void print(list *l)
{
    list *p;
    p=l->next;
    //如果p为空,输出两个零,并返回
    if(p==NULL)
    {
        printf("0 0\n");
        return;
    }
    while(p->next!=NULL)
    {
        printf("%d %d ",p->cofi,p->index);
        p=p->next;
    }
    printf("%d %d\n",p->cofi,p->index);
}
main()
{
    list *L1,*L2,*L3,*L4;
    L1=create();
    L2=create();
    L4=multiply(L1,L2);
    print(L4);
    L3=add(L1,L2);
    print(L3);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值