求解两个多项式的乘积c语言,求两个一元多项式的乘积与和(C语言)

#include #includetypedefstruct PolyNode *Polynomial;structPolyNode {intcoef;intexpon;

Polynomial link;

};void Attach(int c,int e,Polynomial *pRear) {

Polynomial P;

P=(Polynomial)malloc(sizeof(structPolyNode));

P->coef=c;

P->expon=e;

P->link=NULL;

(*pRear)->link=P; /*P指向的新结点插入到当前尾项的后面*/

*pRear=P; /*pRear指针移动到 P结点*/}int Compare(int a,intb){intc;if (a>b) c=1;else if (a

}

Polynomial ReadPoly(){

Polynomial P,Rear,t;intc,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); /*删除临时生成的头结点*/

returnP;

}

Polynomial Add(Polynomial P1,Polynomial P2){

Polynomial front,rear,temp;intsum;

rear=(Polynomial)malloc(sizeof(structPolyNode));

front=rear;//front 用来记录链表头结点

while(P1&&P2){switch(Compare(P1->expon,P2->expon)){case 1:

Attach(P1->coef,P1->expon,&rear);

P1=P1->link;break;case -1:

Attach(P2->coef,P2->expon,&rear);

P2=P2->link;break;case 0:

sum=P1->coef+P2->coef;if(sum){

Attach(sum,P1->expon,&rear);

}

P1=P1->link;

P2=P2->link;break;

}

}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);returnfront;

}

Polynomial Mult(Polynomial P1,Polynomial P2){

Polynomial P,Rear,t1,t2,t;intc,e;if (!P1||!P2) return NULL;//判断如果P1或者P2有一个为NULL,则结果为NULL;

t1=P1;t2=P2;

P=(Polynomial)malloc(sizeof(structPolyNode));

P->link=NULL;

Rear=P;while(t2){

Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);

t2=t2->link;

}

t1=t1->link;//t1已经乘好,后移

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;//当相乘得到的 e小于多项式系数时,Rear指针往后移

if(Rear->link && Rear->link->expon==e){if(Rear->link->coef+c)

Rear->link->coef+=c;//如果多项式系数的和不为 0,则用新的系数赋值

else{

t=Rear->link;

Rear->link=t->link;free(t);//如果多项式的系数为0,则 Rear指针指向下一个项,这个结点释放

}

}else{

t=(Polynomial)malloc(sizeof(structPolyNode));

t->coef=c;t->expon=e;

t->link=Rear->link;

Rear->link=t;Rear=Rear->link;//如果多项式没有到最后并且目前没有这一项,则分配内存空间,新建结点,并将结点插入链表,Rear指针指到新结点 t

}

t2=t2->link;

}

t1=t1->link;

}

t2=P;P=P->link;free(t2);returnP;

}voidPrintPoly(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");

}intmain()

{

Polynomial P1,P2,PP,PS;

P1=ReadPoly();

P2=ReadPoly();

PP=Mult(P1,P2);

PrintPoly(PP);

PS=Add(P1,P2);

PrintPoly(PS);return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值