#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;
}