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

来源:互联网 发布:注册淘宝打电话做什么 编辑:程序博客网 时间:2024/05/14 16:21

https://pta.patest.cn/pta/test/1342/exam/4/question/19209

题意很简单,就是利用链表存储两个一元多项式,然后进行乘法和加法运算。

我开始考虑的方法是:
加法的话,直接就是两个链表的合并。然后乘法就先将第一个链表的第一项去乘第二个链表的每项,得到一个链表,然后每次拿第一个链表的一项来同第二个链表做乘法,再将结果做链表的加法。但是就是一直卡,思路应该是没问题的,但是就是不能AC ,看了后面的再整理了老师的代码。有时间的话,还是要把自己的思路实现好。

以下的实现方法,使用Attach();函数的话,就直接避免了链表的合并那个繁琐的操作了。

#include <iostream>#include <cstdio>#include <cmath>#include <cstdlib>#include <algorithm>using namespace std;#define debug(x) cout<<"---->"<<x<<endl#define MAXN 1005typedef struct PolyNode *Polynomial;struct PolyNode {    int coef; // 系数    int expon; // 指数    Polynomial link; };void Attach(int c, int e, Polynomial *Rear){    Polynomial P = (Polynomial)malloc(sizeof(struct PolyNode));    P->coef=c;    P->expon=e;    P->link=NULL;    (*Rear)->link = P;    *Rear=P; }Polynomial ReadPoly(){    Polynomial P, Rear, t;    int c, e, N;    scanf("%d",&N);    P=(Polynomial)malloc(sizeof(struct PolyNode));     P->link=NULL;    Rear=P;    while (N--){        scanf("%d%d",&c,&e);        Attach(c,e,&Rear);    }    t=P;    P=P->link;    free(t);     return P;}Polynomial Add(Polynomial P1, Polynomial P2){    Polynomial P,Rear,t,t1,t2;    int sum;    t1=P1;    t2=P2;    P=(Polynomial)malloc(sizeof(struct PolyNode));    P->link=NULL;    Rear=P;    while (t1!=NULL &&t2!=NULL){        if(t1->expon ==t2->expon ){            sum = t1->coef + t2->coef;            if (sum)                Attach(sum, t1->expon, &Rear);            t1=t1->link;            t2=t2->link;        }else if(t1->expon > t2->expon){            Attach(t1->coef, t1->expon, &Rear);            t1=t1->link;        }else{            Attach(t2->coef, t2->expon, &Rear);            t2=t2->link;        }    }    while (t1){        Attach(t1->coef, t1->expon, &Rear);        t1=t1->link;    }    while (t2){        Attach(t2->coef, t2->expon, &Rear);        t2=t2->link;    }    Rear->link=NULL;    t=P;    P=P->link;     free(t);     return P;}Polynomial Mult(Polynomial P1, Polynomial P2){    Polynomial P,Rear,t1,t2,t;    int c,e;    if (!P1 || !P2){        return NULL;    }    t1=P1;    t2=P2;    P=(Polynomial)malloc(sizeof(struct PolyNode));     P->link=NULL;    Rear=P;    while (t2){        Attach(t1->coef*t2->coef, t1->expon+t2->expon, &Rear);        t2 = t2->link;    }    t1=t1->link;    while (t1){        t2=P2;        Rear=P;        while(t2){            c=t1->coef*t2->coef;            e=t1->expon+t2->expon;            while (Rear->link && Rear->link->expon > e){                Rear=Rear->link;            }            if (Rear->link && Rear->link->expon == e){                if (Rear->link->coef + c==0){                    t=Rear->link;                    Rear->link=t->link;                    free(t);                }else{                    Rear->link->coef+=c;                }            }else{                t=(Polynomial)malloc(sizeof(struct PolyNode));                t->coef=c;                t->expon=e;                t->link=Rear->link;                Rear->link=t;            }            t2=t2->link;        }        t1=t1->link;    }    t=P;    P=P->link;    free(t);    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 main(){    Polynomial P1,P2,PP,PS;    P1=ReadPoly();    P2=ReadPoly();    PP=Mult(P1,P2);    PrintPoly(PP);    PS=Add(P1,P2);    PrintPoly(PS);    return 0;}
0 0
原创粉丝点击