02 - 线性结构 2 一元多项式的乘法与加法运算 (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 PolyNode *Polynomial;
struct PolyNode{
    int coef;
    int expon;
    Polynomial link;
};
//这用指针传值,实现值得更改
//添加新的多项式节点
void Attach(int c,int e,Polynomial *pRear){
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*pRear)->link=P;
    (*pRear)=P;
}
Polynomial ReadPoly(){
    int N;
    int c,e;
    scanf("%d",&N);
    Polynomial Rear;
    Polynomial p;
    p=(Polynomial)malloc(sizeof(struct PolyNode));
    Rear=p;
    if (N==0) {
        Attach(0, 0, &Rear);
    }else {
        while (N--) {
            scanf("%d%d",&c,&e);
            Attach(c, e, &Rear);
        }

    }
        return p;
}
//输出多项式
void PrintPoly(Polynomial PPoly){
    PPoly=PPoly->link;
    int flag=0;//用来调整输出格式的代码
    while (PPoly) {
        if (!flag) {
            flag=1;
        }else {
            printf(" ");
        }
        printf("%d %d",PPoly->coef,PPoly->expon);
        PPoly=PPoly->link;
    }
    printf("\n");
}
//两个多项式相乘不按指数的大小顺序也不考虑系数相加为零的情况
/*Polynomial Mult(Polynomial P1,Polynomial P2){
    Polynomial P,tmp,p;//p用于记录P2->link的位置
    int c,e;
    P1=P1->link;
    P2=P2->link;
    p=P2;
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    tmp=P;
    while(P1!=NULL){
        while (P2!=NULL) {
            c=P1->coef*P2->coef;
            e=P1->expon+P2->expon;
            Attach(c, e, &tmp);
            P2=P2->link;
        }
        P1=P1->link;
        P2=p;
    }
    return P;
}*/
//考虑分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数
Polynomial Mult(Polynomial P1,Polynomial P2){
    Polynomial tmp1,tmp2,Rear,P,t;
    if (!P1||!P2) {
        return NULL;
    }
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    Rear=P;
    int c,e;
    tmp1=P1->link;
    tmp2=P2->link;
    //先判断是否某个多项试为0
    if (tmp1->coef==0||tmp2->coef==0) {
        Attach(0, 0, &Rear);
        return P;
    }
    //先得出一个初始多项式
    while (tmp2) {
        Attach(tmp1->coef*tmp2->coef, tmp1->expon+tmp2->expon, &Rear);
        tmp2=tmp2->link;
    }
    tmp1=tmp1->link;
    while (tmp1) {
        tmp2=P2->link;
        Rear=P;
        while (tmp2) {
            c=tmp1->coef*tmp2->coef;
            e=tmp1->expon+tmp2->expon;
            while (Rear->link&&Rear->link->expon>e) {
                Rear=Rear->link;
            }
            if (Rear->link&&Rear->link->expon==e) {
                //系数相加还要考虑是否为零
                //1.不为零的情况
                if (Rear->link->coef+c) {
                    Rear->link->coef+=c;
                }else {
                    //2.为零的情况,考虑删去节点
                    t=Rear->link;
                    Rear->link=t->link;
                    free(t);
                }
            }
            else {
                //小于当前节点的情况,需要重新构造一个节点
                Polynomial p=(Polynomial)malloc(sizeof(struct PolyNode));
                p->coef=c;
                p->expon=e;
                p->link=Rear->link;
                Rear->link=p;
                Rear=Rear->link;
            }
            tmp2=tmp2->link;

        }
        tmp1=tmp1->link;
    }
    return P;
}

Polynomial Add(Polynomial P1,Polynomial P2){
    Polynomial tmp1,tmp2,P,t;
    int c,e;
    tmp1=P1->link;
    tmp2=P2->link;
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    t=P;
    while (tmp1&&tmp2) {
        if (tmp1->expon==tmp2->expon) {//如果二者的指数相等,将二者的系数相加
            if((tmp1->coef+tmp2->coef)!=0){
                c=tmp1->coef+tmp2->coef;
                e=tmp1->expon;
                Attach(c, e, &t);
            }
            tmp1=tmp1->link;
            tmp2=tmp2->link;
        }else if (tmp1->expon>tmp2->expon) {
            c=tmp1->coef;
            e=tmp1->expon;
            Attach(c, e, &t);
            tmp1=tmp1->link;
        }else {
            c=tmp2->coef;
            e=tmp2->expon;
            Attach(c, e, &t);
            tmp2=tmp2->link;
        }
    }
    while(tmp1){
        c=tmp1->coef;
        e=tmp1->expon;
        Attach(c, e, &t);
        tmp1=tmp1->link;
    }
    while(tmp2){
        c=tmp2->coef;
        e=tmp2->expon;
        Attach(c, e, &t);
        tmp2=tmp2->link;
    }
    if(!P->link){
        Attach(0,0,&t);
    }
    return P;

}
int main(int argc, char *argv[]) {
    Polynomial P1,P2,PP,PS;
    P1=ReadPoly();
    P2=ReadPoly();

    PP=Mult(P1,P2);
    PrintPoly(PP);


    PS=Add(P1,P2);
    PrintPoly(PS);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值