02-线性结构1 一元多项式的乘法与加法运算 (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 node{ int coefficient; int exponent; struct node * next; } PolyNode, *Polynomial; Polynomial ReadPoly(); void Attach(int c, int e, Polynomial * Rear); Polynomial MultPoly(Polynomial P1, Polynomial P2); Polynomial AddPoly(Polynomial P1, Polynomial P2); void PrintPoly(Polynomial P); int main(int argc, char const *argv[]) { Polynomial Poly1, Poly2, PolySum, PolyMul; Poly1 = ReadPoly(); Poly2 = ReadPoly(); PolyMul = MultPoly(Poly1, Poly2); PrintPoly(PolyMul); PolySum = AddPoly(Poly1, Poly2); PrintPoly(PolySum); return 0; } Polynomial ReadPoly() { Polynomial P, Rear, temp; P = (PolyNode*)malloc(sizeof(PolyNode)); P->next = NULL; Rear = P; int N, c, e; scanf("%d", &N); while(N--){ scanf("%d %d", &c, &e); Attach(c, e, &Rear); } temp = P; P = P->next; free(temp); return P; } void Attach(int c, int e, Polynomial * pRear) { Polynomial P; P = (PolyNode*)malloc(sizeof(PolyNode)); P->coefficient = c; P->exponent = e; P->next = NULL; (*pRear)->next = P; *pRear = P; } Polynomial MultPoly(Polynomial P1, Polynomial P2) { Polynomial P, temp1, temp2, Rear, temp; int c, e; if(!P1 || !P2) return NULL; temp1 = P1; temp2 = P2; P = (PolyNode*)malloc(sizeof(PolyNode)); P->next = NULL; Rear = P; while(temp2){ c = temp1->coefficient * temp2->coefficient; e = temp1->exponent + temp2->exponent; if(c != 0){ Attach(c, e, &Rear); temp2 = temp2->next; } } temp1 = temp1->next; while(temp1){ temp2 = P2, Rear = P; while(temp2){ c = temp1->coefficient * temp2->coefficient; e = temp1->exponent + temp2->exponent; if(c != 0){ while(Rear->next && Rear->next->exponent > e) Rear = Rear->next; if(Rear->next && Rear->next->exponent == e){ if(Rear->next->coefficient + c) Rear->next->coefficient += c; else{ temp = Rear->next; Rear->next = temp->next; free(temp); } } else{ temp = (PolyNode*)malloc(sizeof(PolyNode)); temp->coefficient = c; temp->exponent = e; temp->next = Rear->next; Rear->next = temp; Rear = Rear->next; } temp2 = temp2->next; } } temp1 = temp1->next; } temp = P; P = P->next; free(temp); return P; } Polynomial AddPoly(Polynomial P1, Polynomial P2) { Polynomial P, temp1, temp2, Rear, temp; if(!P1 && !P2){ if(!P1) return P2; else return P1; } P = (PolyNode*)malloc(sizeof(PolyNode)); P->next = NULL; Rear = P; temp1 = P1; temp2 = P2; while(temp1 && temp2){ if(temp1->exponent > temp2->exponent){ if(temp1->coefficient){ Attach(temp1->coefficient, temp1->exponent, &Rear); } temp1 = temp1->next; } else if(temp1->exponent == temp2->exponent){ if(temp1->coefficient + temp2->coefficient){ Attach(temp1->coefficient + temp2->coefficient, temp1->exponent, &Rear); } temp1 = temp1->next; temp2 = temp2->next; } else{ if(temp2->coefficient){ Attach(temp2->coefficient, temp2->exponent, &Rear); } temp2 = temp2->next; } } while(temp1){ Attach(temp1->coefficient, temp1->exponent, &Rear); temp1 = temp1->next; } while(temp2){ Attach(temp2->coefficient, temp2->exponent, &Rear); temp2 = temp2->next; } temp = P; P = P->next; free(temp); return P; } void PrintPoly(Polynomial P) { int flag = 0; if(!P){ printf("0 0"); } while(P){ if (!flag) flag = 1; else printf(" "); printf("%d %d", P->coefficient, P->exponent); P = P->next; } printf("\n"); }