链表实现稀疏多项式求和

仅供参考

#include <iostream>
using  namespace std;

typedef struct PNode{

    float coef;             // 系数
    int expn;               // 指数
    struct PNode *next;     // 指针域
}PNode, *Polynomial;

// 首先要初始化一个空链表,用来表示多项式,然后逐个输入各项,通过比较,
// 找到第一个大于该输入项指数的项,将该输入项插入到此项的前面,
// 这样即可保证多项式链表的有序性。
void CreatePolyn(Polynomial &p, int n){

    PNode  *s = nullptr;
    PNode *pre = nullptr;
    PNode *q = nullptr;
    p = new PNode;                     // 建立一个带头节点的单链表
    p->next = nullptr;
    for (int i = 1; i <=n ; ++i) {      // 依次输入n个非零项
        s = new PNode;                  // 生成新节点
        printf("请输入第%d系数和指数:\n",i);
        cin >> s->coef >> s->expn;      // 输入系数和指数
        pre = p;                        // pre用于保存q的前驱,初值为头结点
        q = p->next;                    // q初始化,指向首元节点
        while ( q && q->expn < s->expn ){   // 找到第一个大于输入项指数的项*q
            pre = q;
            q = q->next;
        }
        s->next = q;                // 将输入项s插入到q和其前驱节点pre之间
        pre->next = s;
    }
}

int PrintPolyn(Polynomial &pa){

    if (pa == nullptr) return -1;
    PNode *p = pa->next;
    while (p){
        printf("%fX^%d+",p->coef, p->expn);
        p = p->next;
    }
    return 0;
}

// 假设头指针Pa、Pb的单链表分别为A、B两个多项式的存储结构,
// 指针p1、p2分别指向A、B中进行比较的某个结点,则逐一比较两个节点中的指数项,
// 对于指数相同的项,对应系数相加,若和不为零,将其插入到“和多项式”链表中;
// 对于指数不同的项,则通过比较将指数数值较小的项插入到“和多项式”链表中去。
void AddPolyn(Polynomial &pa, Polynomial &pb){

    PNode *p1, *p2, *p3, *temp;
    p1 = pa->next;
    p2 = pb->next;
    p3 = pa;
    float sum = 0;
    while (p1 && p2){

        if (p1->expn == p2->expn){
            sum = p1->coef + p2->coef;
            if (sum != 0){

                p1->coef = sum;
                p3->next = p1;      // p3, p1下移
                p3 = p1;
                p1 = p1->next;
                //TODO  删除p2
                temp = p2;         // temp储存p2的地址
                p2 = p2->next;      // p2下移
                pb->next = p2;      // pb指向新的p2
                delete temp;        // 删除以前的p2

            } else{
                //TODO  删除p1,p2
                temp = p1;
                p1 = p1->next;
                pb->next = p1;
                delete temp;

                temp = p2;
                p2 = p2->next;
                pb->next = p2;
                delete temp;

            }
        } else if (p1->expn < p2->expn){

            //TODO 把p1插入到"和多项式"
            p3->next = p1;
            p3 = p1;
            p1 = p1->next;
        } else{

            //TODO 把p2插入到"和多项式"
            p3->next = p2;
            p3 = p2;
            p2 = p2->next;
        }
    }

    //TODO 将非空多项式的剩余段插入到p3所指节点之后
    p3->next = p1?p1:p2;

    //TODO 释放pb结点
    delete pb;

    int ret = PrintPolyn(pa);
    if (ret != 0) cout << "PrintPolyn error" << endl;
}




int main() {

    // A(x) = 7 + 3x + 9x^8 + 5x^17
    // B(x) = 8x + 22x^7 - 9x^8
    // (7, 0) (3, 1) (9, 8) (5, 17)
    // (8, 1) (22, 7) (-9, 8)
    Polynomial Ax, Bx;
    int n1, n2;
    cout << "请输入Ax的项数:" << endl;
    cin >> n1;
    CreatePolyn(Ax, n1);

    cout << "请输入Bx的项数:" << endl;
    cin >> n2;
    CreatePolyn(Bx, n2);
    AddPolyn(Ax, Bx);

    return 0;
}

测试: 

请输入第1系数和指数:
7 0
请输入第2系数和指数:
3 1
请输入第3系数和指数:
9 8
请输入第4系数和指数:
5 17
请输入第1系数和指数:
8 1
请输入第2系数和指数:
22 7
请输入第3系数和指数:
-9 8
7.000000X^0+11.000000X^1+22.000000X^7+5.000000X^17+

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值