完整的文件见另一篇博客 https://www.cnblogs.com/fanlumaster/p/13839645.html
Polynomial PolyMult(Polynomial P1, Polynomial P2)
{
Polynomial P, Rear, t1, t2, t;
int c, e;
if (!P1 || !P2) return NULL;
t1 = P1;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
while (t1)
{
t2 = P2; // 每次循环之后要把 t2 归位到链表的开头
Rear = P; // 每一次循环都要重新初始化 Rear,使 Rear 的初始值指向链表头
while (t2)
{
c = t1->coef + t2->coef;
e = t1->expon + t2->expon;
while (Rear->link && Rear->link->expon > e) // 注意,这里和 e 作比较的是 Rear 的下一个节点中的值,这样下面的插入操作才解释得通
Rear = Rear->link;
if (Rear->link && Rear->link->expon == e) {
if (Rear->link->coef + c)
Rear->link->coef += c;
else { // 系数相加等于 0 的情况,要把该节点删掉
t = Rear->link;
Rear->link = t->link;
free(t);
}
} else { // 指数相加啊小于尾节点指数的情况,直接附加到结尾就成
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->coef = c;
t->expon = e;
t->link = Rear->link;
Rear->link = t; // 直接将 t2 的值附加到
Rear = Rear->link;
}
t2 = t2->link; // 指针往后移动
}
t1 = t1->link;
}
t2 = P;
P = P->link;
free(t2); // 释放第一个没有存储数据得节点
return P;
}