#include <stdio.h> #include <stdlib.h> typedef struct Polynode *Polynomial; struct Polynode { int coef; int expon; Polynomial link; }; void PrintPoly(Polynomial P) { int flag = 0; if(!P) { printf("0 0 "); return ; } while(P) { if(!flag) flag=1; else printf(" "); printf("%d %d", P->coef, P->expon); P=P->link; } printf(" "); } void Attach(int c, int e, Polynomial *Rear) { Polynomial P; P=(Polynomial)malloc(sizeof(Polynode)); P->coef = c; P->expon = e; P->link = NULL; (*Rear)->link = P; *Rear = P; } Polynomial Mult(Polynomial P1, Polynomial P2) { Polynomial P, Rear, t1, t2, t; int c, e; if(!P1 || !P2) return 0; t1 = P1; t2 = P2; P=(Polynomial)malloc(sizeof(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) { e = t1->expon+t2->expon; c = t1->coef*t2->coef; while(Rear->link && Rear->link->expon>e) Rear = Rear->link; if(Rear->link && Rear->link->expon == e) { if(Rear->link->coef+c) { Rear->link->coef += c; } else { t = Rear->link; Rear->link = t->link; free(t); } } else { t = (Polynomial)malloc(sizeof(Polynode)); t->coef = c; t->expon = e; t->link = Rear->link; Rear->link = t; Rear = Rear->link; } t2 = t2->link; } t1 = t1->link; } t2 = P; P = P->link; free(t2); return P; } Polynomial ADD(Polynomial P1, Polynomial P2) { Polynomial t1, t2, P, t, Rear; t1 = P1; t2 = P2; P=(Polynomial)malloc(sizeof(Polynode)); P->link = NULL; Rear = P; while(t1 && t2) { if(t1->expon == t2->expon) { if(t1->coef+t2->coef) { t = (Polynomial)malloc(sizeof(Polynode)); t->coef=t1->coef+t2->coef; t->expon = t1->expon; t->link = Rear->link; Rear->link = t; Rear = Rear->link; } t1 = t1->link; t2 = t2->link; } else if(t1->expon > t2->expon) { t = (Polynomial)malloc(sizeof(Polynode)); t->coef=t1->coef; t->expon = t1->expon; t->link = Rear->link; Rear->link = t; Rear = Rear->link; t1 = t1->link; } else { t = (Polynomial)malloc(sizeof(Polynode)); t->coef=t2->coef; t->expon = t2->expon; t->link = Rear->link; Rear->link = t; Rear = Rear->link; t2 = t2->link; } } Rear->link = t1?t1:t2; t = P; P = P->link; free(t); return P; } Polynomial ReadPoly() { int n, c, e; Polynomial Rear, P, t; P=(Polynomial)malloc(sizeof(Polynode)); P->link=NULL; Rear = P; scanf("%d", &n); while(n --) { scanf("%d %d", &c, &e); Attach(c, e, &Rear); } t = P; P = P->link; free(t); return P; } 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; }