设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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;
};
Polynomial ReadPoly();
void Attach(int c,int e,Polynomial *pRear);
Polynomial Add(Polynomial p1,Polynomial p2);
Polynomial Mult(Polynomial p1,Polynomial p2);
void PrintPoly(Polynomial p);
int main()
{
Polynomial p1,p2,pp,ps;
p1 = ReadPoly();
p2 = ReadPoly();
pp = Mult(p1,p2);
ps = Add(p1,p2);
PrintPoly(pp);
printf("\n");
PrintPoly(ps);
return 0;
}
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;
}
void Attach(int c,int e,Polynomial *pRear)
{
Polynomial p;
p = (Polynomial)malloc(sizeof(struct PolyNode));
p->coef = c;
p->expon = e;
p->link = NULL;
(*pRear)->link = p;
(*pRear) = p;
}
Polynomial Add(Polynomial p1,Polynomial p2)
{
Polynomial P,Rear,t;
if(!p1&&!p2) return NULL;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while (p1 && p2) {
if(p1->expon>p2->expon){
Attach(p1->coef,p1->expon,&Rear);
p1 = p1->link;
}
else if(p1->expon<p2->expon) {
Attach(p2->coef,p2->expon,&Rear);
p2 = p2->link;
}
else {
if(p2->coef+p1->coef) Attach(p2->coef+p1->coef,p2->expon,&Rear);
p1 = p1->link;
p2 = p2->link;
}
}
while(p1){
Attach(p1->coef,p1->expon,&Rear);
p1 = p1->link;
}
while(p2){
Attach(p2->coef,p2->expon,&Rear);
p2 = p2->link;
}
t=P;
P=P->link;
free(t);
return P;
}
Polynomial Mult(Polynomial p1,Polynomial p2)
{
Polynomial t1,t2,P,Rear,t;
if(!p1||!p2) return NULL;
int c = 0;
int e = 0;
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){
Rear->link->coef+=c;
}
else {
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else {
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->coef = c;
t->expon = e;
t->link = Rear->link;
Rear->link = t;
Rear = Rear->link;
}
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");
}
else {
while (p){
if(!flag){
flag = 1;
}
else {
printf(" ");
}
printf("%d %d",p->coef,p->expon);
p=p->link;
}
}
}