算法思路:两个指针P1和P2分别指向这两个多项式第一个节点,不断循环:
- P1->expon==P2->expon:系数相加,若结果不为0,则作为结果多项式对应项的系数。同时,P1和P2都分别指向下一项;
- P1->expon>P2->expon:将P1的当前项存入结果多项式,并使P1指向下一项;
- P1->expon<P2->expon:将P2的当前项存入结果多项式,并使P2指向下一项;
当某一多项式处理完时,将另一个多项式的所有节点依次复制到结果多项式中去。
算法:
1 Polynomial PolyAdd(Polynomial P1,Polynomial P2) 2 { 3 Polynomial front,rear,temp; 4 int sum; 5 rear=(Polynomial)malloc(sizeof(struct Polynomial)); 6 front=rear; 7 while(P1&&P2) 8 { 9 switch(Compare(P1->expon,P2->expon)){ 10 case 1: 11 Attach(P1->coef,P1->expon,&rear); 12 P1=P1->link; 13 break; 14 case -1: 15 Attach(P1->coef,P1->expon,&rear); 16 P1=P1->link; 17 break; 18 csae 0: 19 sum=P1->coef+P2->coef; 20 if(sum) Attach(sum,P1->expon,&rear); 21 P1=P1->link; 22 P2=P2->link; 23 break; 24 } 25 for(;P1: P1=P1->link;) Attach(P1->coef,P1->expon,&rear); 26 for(;P2: P2=P2->link;) Attach(P2->coef,P2->expon,&rear); 27 rear->link=NULL; 28 temp=front; 29 front=front->link; 30 free(temp); 31 return front; 32 }
Attach实现:
1 void Attach(int c,int e,Polynomial *pRear) 2 { 3 Polynomial P; 4 P=(Polynomial)malloc(sizeof(struct Polynomial)); 5 P->coef=c; 6 P->expon=e; 7 P->link=NULL: 8 (*pRear)->link=P; 9 *pRear=p; 10 } 11
数据结构:
1 struct PolyNode{ 2 int ceof; 3 int expon; 4 struct PolyNode *link; 5 } 6 typedef struct PolyNode *Polynomial; 7 Polynomial P1,P2;