浙大版《数据结构(第2版)》 一元多项式的乘法与加法运算c语言实现

习题3.6 一元多项式的乘法与加法运算 (20 分)

输入格式:
输入分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>
typedef struct dxs
{
    int xs;
    int zs;
    struct dxs *next;
} d;
d* create(int n)
{
    d *p,*q,*front;
    int i;
    p=(d*)malloc(sizeof(d));
    p->next=NULL;
    front=p;
    for(i=0; i<n; i++)
    {
        q=(d*)malloc(sizeof(d));
        scanf("%d %d",&q->xs,&q->zs);
        q->next=p->next;
        p->next=q;
        p=q;
    }
    return front;
}
d* add(d * a,d * b)
{
    d *p,*q,*front;
    p=(d*)malloc(sizeof(d));
    p->next=NULL;
    front=p;
    a=a->next;
    b=b->next;
    while(a!=NULL&&b!=NULL)
    {
        if(a->zs==b->zs)
        {
            q=(d*)malloc(sizeof(d));
            q->xs=a->xs+b->xs;
            if(q->xs)
            {
                q->zs=a->zs;
                a=a->next;
                b=b->next;
                q->next=p->next;
                p->next=q;
                p=q;
            }
            else
            {
                a=a->next;
                b=b->next;
                free(q);
            }
        }
        else if(a->zs>b->zs)
        {
            q=(d*)malloc(sizeof(d));
            q->zs=a->zs;
            q->xs=a->xs;
            a=a->next;
            q->next=p->next;
            p->next=q;
            p=q;
        }
        else
        {
            q=(d*)malloc(sizeof(d));
            q->zs=b->zs;
            q->xs=b->xs;
            b=b->next;
            q->next=p->next;
            p->next=q;
            p=q;
        }
    }
    if(a!=NULL)
    {
        while(a!=NULL)
        {
            q=(d*)malloc(sizeof(d));
            q->zs=a->zs;
            q->xs=a->xs;
            a=a->next;
            q->next=p->next;
            p->next=q;
            p=q;
        }
    }
    if(b!=NULL)
    {
        q=(d*)malloc(sizeof(d));
        q->zs=b->zs;
        q->xs=b->xs;
        b=b->next;
        q->next=p->next;
        p->next=q;
        p=q;
    }
    return front;
}
d* multiplies(d * a,d * b)
{
    d *p,*q,*front,*B;
    p=(d*)malloc(sizeof(d));
    p->next=NULL;
    front=p;
    a=a->next;
    b=b->next;
    B=b;
    while(a!=NULL)
    {
        q=(d*)malloc(sizeof(d));
        q->xs=a->xs*b->xs;
        q->zs=a->zs+b->zs;
        b=b->next;
        q->next=p->next;
        p->next=q;
        p=q;
        if(b==NULL)
        {
            a=a->next;
            b=B;
        }
    }
    return front;
}
d* hb(d * a)
{
    int temp1,temp2;
    d *p,*q,*max;
    for(p=a->next; p!=NULL; p=p->next)
    {
        max=p;
        for(q=p->next; q!=NULL; q=q->next)
        {
            if(q->zs>max->zs)
            {
                max=q;
            }
        }
        if(max!=p)
        {
            temp1=p->zs;
            p->zs=max->zs;
            max->zs=temp1;
            temp2=p->xs;
            p->xs=max->xs;
            max->xs=temp2;
        }
    }
    p=a->next;
    max=p;
    while(p->next!=NULL)
    {
        if(p->zs==p->next->zs)
        {
            p->xs=p->xs+p->next->xs;
            if(p->xs!=0)
            {
                q=p->next;
                p->next=p->next->next;
                free(q);
            }
            else
            {
                q=max->next;
                max->next=p->next->next;
                free(q);
            }
        }
        max=p;
        p=p->next;
    }
    return a;
}
void print(d* p)
{
    p=p->next;
    if(p==NULL)
        printf("0 0");
    else
    {
        while(p!=NULL)
        {
            if(p->next!=NULL)
                printf("%d %d ",p->xs,p->zs);
            else
                printf("%d %d",p->xs,p->zs);
            p=p->next;
        }
    }
    printf("\n");
}
int main()
{
    int n1 ,n2;
    d *front1,*front2,*front,*Front;
    scanf("%d",&n1);
    front1=create(n1);
    scanf("%d",&n2);
    front2=create(n2);
    front=add(front1,front2);
    if(n1==0||n2==0)
        printf("0 0\n");
    else
    {
        Front=multiplies(front1,front2);
        print(hb(Front));
    }
    print(front);
    return 0;
}

200多行是目前写过最长的了,这个题其实也没那么恐怖(我自己是刚刚学代码对是对了肯定还有很多值得改进的地方),主要是要会创建一个链表来存储多项式,然后要会遍历这个链表,删除一个结点,排序等对链表的基本操作掌握会该题应该就能解决。
最后如果部分正确可以看看哪些数据没过再去调整
在这里插入图片描述

图来自该博主https://blog.csdn.net/zl1085372438

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值