一元多项式的乘法与加法运算 PTA02-线性结构1

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

输入分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;//the same as 'struct PolyNode *link'
};

void Attach(int coef,int expon,Polynomial *PtrRear);//attach the rear value
Polynomial ReadPoly();//read the polynomial
void PrintPoly(Polynomial P);
Polynomial Add(Polynomial P1,Polynomial P2);
Polynomial Mult(Polynomial P1,Polynomial P2);
int compare(int e1,int e2);

int main(){
    Polynomial P1,P2,PP,PS;

    P1=ReadPoly();
    P2=ReadPoly();
    PP=Mult(P1,P2);
    PrintPoly(PP);
    PS=Add(P1,P2);
    PrintPoly(PS);

    return 0;
}

void Attach(int coef,int expon,Polynomial *PtrRear){
    Polynomial P;

    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->coef=coef;
    P->expon=expon;
    P->link=NULL;
    (*PtrRear)->link=P;
    *PtrRear=P;
}

Polynomial ReadPoly(){
    Polynomial P,Rear,Temp;
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    Rear=P;
    int N;//polynomial number
    scanf("%d",&N);
    int c,e;//cofficient and ecponent
    while(N--){
        scanf("%d %d",&c,&e);
        Attach(c,e,&Rear);
    }
    Temp=P;
    P=P->link;
    free(Temp);
    return P;
}

void PrintPoly(Polynomial P){
    int flag=0;
    if(!P){
        printf("0 0\n");
        return;
    }
    while(P){
        if(!flag) flag=1;
        else printf(" ");
        printf("%d %d", P->coef,P->expon);
        P=P->link;
    }
    printf("\n");
}

int compare(int e1,int e2){
    if(e1>e2) return 1;
    else if(e1<e2) return -1;
    else return 0;
}

Polynomial Add(Polynomial P1,Polynomial P2){
    Polynomial PS,rear,temp;
    int sum;
    PS=(Polynomial)malloc(sizeof(struct PolyNode));
    PS->link=NULL;
    rear=PS;
    while(P1&&P2){
        switch(compare(P1->expon,P2->expon)){
            case 1:
                Attach(P1->coef,P1->expon,&rear);
                P1=P1->link;
                break;
            case -1:
                Attach(P2->coef,P2->expon,&rear);
                P2=P2->link;
                break;
            case 0:
                sum=P1->coef+P2->coef;
                if(sum) Attach(sum,P1->expon,&rear);//coef=0 then do nothing
                P1=P1->link;
                P2=P2->link;
                break;
        }
    }
    while(P1){
        Attach(P1->coef,P1->expon,&rear);
        P1=P1->link;
    }
    while(P2){
        Attach(P2->coef,P2->expon,&rear);
        P2=P2->link;
    }
    //rear->link=NULL;
    temp=PS;
    PS=PS->link;
    free(temp);
    return PS;
}

Polynomial Mult(Polynomial P1,Polynomial P2){
    Polynomial PP,rear,tp1,tp2,tpfree,tpadd;
    int tpe,tpc;
    if(!P1||!P2) return NULL;
    tp1=P1;tp2=P2;
    PP=(Polynomial)malloc(sizeof(struct PolyNode));
    PP->link=NULL;
    rear=PP;
    while(tp2){
        Attach(tp1->coef*tp2->coef,tp1->expon+tp2->expon,&rear);
        tp2=tp2->link;
    }
    tp1=tp1->link;
    while(tp1){
        tp2=P2;rear=PP;
        while(tp2){
            tpe=tp1->expon+tp2->expon;
            tpc=tp1->coef*tp2->coef;
            while(rear->link&&rear->link->expon>tpe) rear=rear->link;
            if(rear->link&&rear->link->expon==tpe){
                if(rear->link->coef+tpc)
                    rear->link->coef+=tpc;
                else{
                    tpfree=rear->link;
                    rear->link=tpfree->link;
                    free(tpfree);
                }
            }
            else{
                tpadd=(Polynomial)malloc(sizeof(struct PolyNode));
                tpadd->coef=tpc;tpadd->expon=tpe;
                tpadd->link=rear->link;
                rear->link=tpadd;
                rear=rear->link;
            }
            tp2=tp2->link;
        }
        tp1=tp1->link;
    }
    tpfree=PP;PP=PP->link;free(tpfree);

    return PP;
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值