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

来源:互联网 发布:在线c语言编译 编辑:程序博客网 时间:2024/05/29 07:45

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

输入分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 valuePolynomial ReadPoly();//read the polynomialvoid 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;}   
0 0
原创粉丝点击