多项式加法
多项式加法运算
采用不带头结点的单向链表,按照指数递减的顺序排列各项
struct PolyNode{
int coef;//系数
int expon;//指数
struct PolyNode *link;//指向下一个结点的指针
};
typedef struct PolyNode *Polynoimal;
Polynomial P1, P2;
算法思路:两个指针P1和P2分别指向这两个多项式第一个结点,不断循环:
- P1->expon == P2->expon:系数相加,若结果不为0,则作为结果多项式对应项的系数。同时,P1和P2都分别指向下一项
- P1->expon>P2->expon:将P1的当前项存入结果多项式,并使P1指向下一项
- P1->expon < P2->exoon:将P2的当前项存入结果多项式,并使P2指向下一项
当某一多项式处理完时将另一个多项式的所有节点依次复制到结果多项式中取
Polynoimal PolyAdd(Polynomial P1, Polynomial P2){
Polynoimal front,rear,temp;
int sum;
rear = (Polynomial)malloc(sizeof(struct PolyNode));
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->expon, &rear);
for(;P2;P2 = P2->link)Attach(P2->expon, &rear);
rear->link=NULL;
temp=front;
front=front->link;//令front指向结果多项式第一个非零项
free(temp);//释放临时空表头结点
return front;
}
void Attach(int c, int e, Polynomial *pRear){
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->coef = c; //对新节点复制
P->expon= e;
P->link=NULL;
(*pRear)->link = P;
*pRear = P; //修改pRear值
}