您的位置:首页 > 其它

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

2015-10-01 00:12 337 查看
设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出
00


输入样例:

434-5261-20
3520-7431

输出样例:

1524-25223021-1020-218356-335144-153182-61
520-44-5291-20


#include<stdio.h>
#include<stdlib.h>
typedefstructPolyNode*Polynomial;
structPolyNode
{
intcoef;
intexpon;
structPolyNode*next;
};

PolynomialReadPoly();
voidAttach(intc,inte,Polynomial*pReal);
PolynomialAdd(PolynomialP1,PolynomialP2);
PolynomialMult(PolynomialP1,PolynomialP2);
voidPrintPoly(PolynomialP);

intmain()
{
PolynomialP1,P2,PMult,PSum;
P1=ReadPoly();
P2=ReadPoly();
PMult=Mult(P1,P2);
PrintPoly(PMult);
PSum=Add(P1,P2);
PrintPoly(PSum);
return0;
}
PolynomialReadPoly()
{
PolynomialP,Rear,t;
intc,e,N;
scanf("%d",&N);
P=(Polynomial)malloc(sizeof(structPolyNode));
P->next=NULL;
Rear=P;
while(N--){
scanf("%d%d",&c,&e);
Attach(c,e,&Rear);
}
t=P;
P=P->next;
free(t);
returnP;
}
voidAttach(intc,inte,Polynomial*pReal)
{
PolynomialP;
P=(Polynomial)malloc(sizeof(structPolyNode));
P->coef=c;
P->expon=e;
P->next=NULL;
(*pReal)->next=P;
*pReal=P;
}

PolynomialAdd(PolynomialP1,PolynomialP2)
{
PolynomialP,t1,t2,t,Rear;
if(!P1&&!P2){
if(!P1)
returnP2;
else
returnP1;
}
P=(Polynomial)malloc(sizeof(structPolyNode));
P->next=NULL;
Rear=P;
t1=P1;
t2=P2;
while(t1&&t2){
if(t1->expon==t2->expon){
if(t1->coef+t2->coef)
Attach(t1->coef+t2->coef,t1->expon,&Rear);
t1=t1->next;
t2=t2->next;
}
elseif(t1->expon>t2->expon){
if(t1->coef)
Attach(t1->coef,t1->expon,&Rear);
t1=t1->next;
}
else{
if(t2->coef)
Attach(t2->coef,t2->expon,&Rear);
t2=t2->next;
}
}
while(t1){
if(t1->coef)
Attach(t1->coef,t1->expon,&Rear);
t1=t1->next;
}
while(t2){
if(t2->coef)
Attach(t2->coef,t2->expon,&Rear);
t2=t2->next;
}
t=P;
P=P->next;
free(t);
returnP;
}
PolynomialMult(PolynomialP1,PolynomialP2)
{
PolynomialP,t1,t2,t,Rear;
intc,e;
if(!P1||!P2)
returnNULL;
t1=P1;
t2=P2;
P=(Polynomial)malloc(sizeof(structPolyNode));
P->next=NULL;
Rear=P;
while(t2){
if(t1->coef*t2->coef){
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
}
t2=t2->next;
}
t1=t1->next;
while(t1){
t2=P2;
Rear=P;
while(t2){
e=t1->expon+t2->expon;
c=t1->coef*t2->coef;
while(Rear->next&&Rear->next->expon>e)
Rear=Rear->next;
if(Rear->next&&Rear->next->expon==e){
if(Rear->next->coef+c)
Rear->next->coef+=c;
else{
t=Rear->next;
Rear->next=t->next;
free(t);
}
}
else{
if(c){
t=(Polynomial)malloc(sizeof(structPolyNode));
t->coef=c;
t->expon=e;
t->next=Rear->next;
Rear->next=t;
Rear=Rear->next;
}
}
t2=t2->next;
}
t1=t1->next;
}
t2=P;
P=P->next;
free(t2);
returnP;
}
voidPrintPoly(PolynomialP)
{
intflag=0;
if(!P)
printf("00");
while(P){
if(!flag)
flag=1;
else
printf("");
printf("%d%d",P->coef,P->expon);
P=P->next;
}
printf("\n");
}


需注意的点:需系数为0时的处理!

乘法运算实现方法即多项式逐项相乘的手算方法,将所得单项结果有序插入第一个多项式第一项与第二个多项式所得的多项式P中。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: