一元多项式的加法
两个一元多项式相加,指数相等的情况下系数相加,例如:
(3X^5+4X^2-1)+(2X^4+2X^2-X)
在链表的每一个节点中,保存每一项的指数以及系数,同时使用节点指针指向下一个低次项,定义数据结构如下:
struct PolyNode{
int coef;
int expon;
struct PolyNode *link;
};
typedef struct PolyNode *Polynomial;
复制代码
算法定义:
循环的比较两个多项式中的每一项的次数,如果 A 节点的次数大于 B 节点的次数那么将 A 节点插入结果链表,同时将 A 节点指向下一个节点,如果 A 节点的次数等于 B 节点的次数,那么将两个节点的系数相加,将系数和以及 A(B) 节点的次数插入新的链表。
代码实现:
int Compare(int A, int B){
int result;
if(A>B){
result=1;
}else if(A==B){
result=0;
}else{
result=-1;
}
return result;
}
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;
}
Polynomial PolyAdd(Polynomial P1,Polynomial P2){
Polynomial front,rear,temp;
int sum;
rear=(Polynomial) malloc(sizeof(struct PolyNode));
front=rear;
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;
default:
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);
return front;
}
复制代码