习题3.6 一元多项式的乘法与加法运算 (20 分)+c语言链表实现

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

输入格式:

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

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

参考代码:

#include<stdio.h>
#include<stdlib.h>
struct NNode{
    int A;//系数
    int F;//指数
    struct NNode* Next;
};
typedef struct NNode* ComNumber;
ComNumber Add(ComNumber a,ComNumber b);
ComNumber Mul(ComNumber a,ComNumber b);

int main()
{
    int n1,n2;
    ComNumber N1,N2,tail1,tail2,temp;
    ComNumber AddR,MulR;
    //创建两个多项式的头结点
    N1=(ComNumber)malloc(sizeof(struct NNode));
    N1->A=0;
    N1->F=0;
    N1->Next=NULL;
    tail1=N1;
    N2=(ComNumber)malloc(sizeof(struct NNode));
    N2->A=0;
    N2->F=0;
    N2->Next=NULL;
    tail2=N2;
    //输入第一个多项式
    scanf("%d",&n1);
    for(int i=0;i<n1*2;i+=2)
    {
        temp=(ComNumber)malloc(sizeof(struct NNode));
        temp->Next=NULL;
        scanf("%d%d",&(temp->A),&(temp->F));
        tail1->Next=temp;
        tail1=tail1->Next;
    }
    //输入第二个多项式
    scanf("%d",&n2);
    for(int i=0;i<n2*2;i+=2)
    {
        temp=(ComNumber)malloc(sizeof(struct NNode));
        temp->Next=NULL;
        scanf("%d%d",&(temp->A),&(temp->F));
        tail2->Next=temp;
        tail2=tail2->Next;
    }
    //加法破坏了N1和N2,必须先计算乘法
    //两个多项式求乘积
    MulR=Mul(N1,N2);
    //两个多项式求和
    AddR=Add(N1,N2);
    //输出乘积
    ComNumber p1;//用于遍历结果
    if(MulR->Next==NULL)
    {
        printf("0 0");
    }
    else
    {
        p1=MulR->Next;
        printf("%d %d",p1->A,p1->F);
        for(p1=p1->Next;p1!=NULL;p1=p1->Next)
        {
            printf(" %d %d",p1->A,p1->F);
        }
    }
    printf("\n");
    //输出和
    if(AddR->Next==NULL)
    {
        printf("0 0");
    }
    else
    {
        p1=AddR->Next;
        printf("%d %d",p1->A,p1->F);
        for(p1=p1->Next;p1!=NULL;p1=p1->Next)
        {
            printf(" %d %d",p1->A,p1->F);
        }
    }
    return 0;
}
ComNumber Add(ComNumber N1,ComNumber N2)
{
    ComNumber tail,p1,p2,p;//tail记录和的尾,p1,p2遍历两个多项式,p用于开辟新节点
    ComNumber Sum=(ComNumber)malloc(sizeof(struct NNode));
    Sum->A=0;
    Sum->F=0;
    Sum->Next=NULL;
    tail=Sum;
    p1=N1->Next;
    p2=N2->Next;
    while(p1!=NULL&&p2!=NULL)
    {
        if(p1->F>p2->F)
        {
            tail->Next=p1;
            p1=p1->Next;
            tail=tail->Next;
        }
        else if(p1->F<p2->F)
        {
            tail->Next=p2;
            p2=p2->Next;
            tail=tail->Next;
        }
        else
        {
            if(p1->A+p2->A!=0)
            {
                p=(ComNumber)malloc(sizeof(struct NNode));
                p->A=p1->A+p2->A;
                p->F=p1->F;
                tail->Next=p;
                p1=p1->Next;
                p2=p2->Next;
                tail=tail->Next;
            }
            else//合并同类项时有抵消
            {
                p1=p1->Next;
                p2=p2->Next;
            }
        }
    }
    if(p1!=NULL)
    {
        tail->Next=p1;
    }
    if(p2!=NULL)
    {
        tail->Next=p2;
    }
    return Sum;
}
//单项式乘以多项式
ComNumber SingleMul(ComNumber N1,ComNumber N2)
{
    //N1位多项式,N2为单项式
    ComNumber Result,tail,temp;//tail记录结果的尾,temp用于开辟空间

    Result=(ComNumber)malloc(sizeof(struct NNode));
    Result->A=0;
    Result->F=0;
    Result->Next=NULL;
    tail=Result;

    ComNumber p;//用于遍历多项式
    p=N1->Next;
    while(p!=NULL&&N2->A!=0)
    {
        for(;p!=NULL;p=p->Next)
        {
            temp=(ComNumber)malloc(sizeof(struct NNode));
            temp->A=(p->A)*(N2->A);
            temp->F=(p->F)+(N2->F);
            temp->Next=NULL;
            tail->Next=temp;
            tail=tail->Next;
        }
    }
    return Result;
}
ComNumber Mul(ComNumber N1,ComNumber N2)
{
    ComNumber tail,p1,p2,p;//tail记录和的尾,p1,p2遍历两个多项式,p用于开辟新节点

    ComNumber Mult=(ComNumber)malloc(sizeof(struct NNode));
    Mult->A=0;
    Mult->F=0;
    Mult->Next=NULL;
    tail=Mult;

    p1=N1->Next;
    p2=N2->Next;
    while(p1!=NULL&&p2!=NULL)
    {
        for(;p1!=NULL;p1=p1->Next)
        {
            Mult=Add(Mult,SingleMul(N2,p1));
        }
    }
    return Mult;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘风xs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值