算法思路:两个指针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;