链表实现多项式的乘法

完整的文件见另一篇博客 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;
}
原文地址:https://www.cnblogs.com/fanlumaster/p/13839658.html