设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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;
};
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 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 front,rear,temp;
int sum;
rear=(Polynomial)malloc(sizeof(struct PolyNode));
rear->link=NULL;
front = rear;
while(p1&&p2)
{
if(p1->expon==p2->expon)
{
sum=p1->coef+p2->coef;
if(sum)Attach(sum,p1->expon,&rear);
p1=p1->link;
p2=p2->link;
}
else if(p1->expon>p2->expon)
{
Attach(p1->coef,p1->expon,&rear);
p1=p1->link;
}
else
{
Attach(p2->coef,p2->expon,&rear);
p2=p2->link;
}
}
for(;p1;p1=p1->link)Attach(p1->coef,p1->expon,&rear);
for(;p2;p2=p2->link)Attach(p2->coef,p2->expon,&rear);
rear->link=NULL;
temp=front;
front=front->link;
free(temp);
return front;
}
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");
}
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));
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(struct 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;
}
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;
}