多项式加法运算
我们准备采用不带头节点的单向链表结构表示一元多项式,并按照指数递减的顺序排列各项。
对列表存放的两个多项式进行加法运算时,可以使用两个指针p1和p2。初始时的p1和p2分别指向这两个多项式第1个节点(指数的最高项)。通过循环不断比较p1和p2所指的节点,比较结果为以下三种情况之一并作不同处理。
- 两数据项指数相等
若结果不为0,将结果对应的系数连同指数一并存入结果多项式。沿着两结点的链域,使P1和P2分别指向两个多项式的下一项,再进行新一轮比较。 - P1中的数据项指数较大
P2保持不变,把P1的当前项存入多项式,P1指向下一项。 - P2中的数据项指数较大
P1保持不变,把P2的当前项存入多项式,P2指向下一项。
代码实现
c
typedef struct PolyNode* PtrToPolyNode;
struct PolyNode {
int Coef;
int Expon;
PtrToPolyNode Next;
};
typedef PtrToPolyNode Polynomial;
int compare(int e1, int e2) {
if (e1 > e2) {
return 1;
}
else if(e1 < e2)
{
return -1;
}
else
{
return 0;
}
}
void Attach(int ceof, int expon, Polynomial* PtrRear) {
Polynomial t;
t->Expon = expon;
t->Coef = ceof;
t->Next = NULL;
(*PtrRear)->Next = t;
*PtrRear = t;
}
Polynomial PolyAdd(Polynomial P1, Polynomial P2) {
Polynomial front, rear;
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->Next;
break;
case -1:
Attach(P2->Coef, P2->Expon, &rear);
P2 = P2->Next;
break;
case 0:
int sum = P1->Coef + P2->Coef;
if (sum) {
Attach(sum, P1->Expon, &rear);
P1->Next;
P2->Next;
break;
}
}
}
for (; P1; P1 = P1->Next) {
Attach(P1->Coef, P1->Expon, &rear);
}
for (; P2; P2 = P2->Next) {
Attach(P2->Coef, P2->Expon, &rear);
}
rear->Next = NULL;
Polynomial temp = front;
front = front->Next;
free(temp);
return front;
}