用单链表将两个一元多项式相加

将两个一元多项式相加

问题描述:要求用链表表示一元多项式,并实现算法求两个多项式的和。

#include <iostream>

using namespace std;

struct polyNode
{
    double coef;    // 表示底数
    int exp;    // 表示指数
    polyNode* next;
};

polyNode* createPoly();
void dispPoly(polyNode*);
polyNode* addPoly(polyNode*, polyNode*);

int main()
{
    polyNode* a{createPoly()}, *b{createPoly()}, *c;

    cout << "a = ";
    dispPoly(a);
    cout << "b = ";
    dispPoly(b);
    c = addPoly(a, b);
    cout << "c = a + b = ";
    dispPoly(c);

    return 0;
}

polyNode* createPoly()
{
    polyNode* p{nullptr};
    cout << "创建多项式(当底数和指数同时为0时结束):";
    for (polyNode* q{p}, *r; ; q = r) {
        r = new polyNode;
        cin >> r->coef >> r->exp;
        r->next = nullptr;
        if (!(r->coef) && !(r->exp)) {  // 若底数和指数同时为0,则返回p
            return p;
        }
        if (!p) {   // 若头节点指针未赋值
            p = r;  // 则令头节点指针指向当前新节点
        } else {    // 若头节点指针已赋值
            q->next = r;    // 则将新节点接入表尾
        }
    }
}

void dispPoly(polyNode* h)
{
    for (polyNode* p{h}; p; p = p->next) {
        if (p->exp) {   // 若指数不为0
            cout << p->coef << "^" << p->exp;
            cout << " + ";
        } else {    // 若指数为0,则不打印指数部分
            cout << p->coef;
        }
    }
    cout << endl;
}

polyNode* addPoly(polyNode* a, polyNode* b)
{
    polyNode* c{nullptr},* p{c};
    for (polyNode* r; a && b; ) {
        r = new polyNode;
        if (a->exp == b->exp) { // 若a数据域的指数等于b的指数
            r->coef = a->coef + b->coef;    // 新节点的数据域的底数等于a的底数与b的底数之和
            r->exp = a->exp;
            a = a->next;    // a和b都指向各自的下一个节点
            b = b->next;
        } else if(a->exp > b->exp) {    // 若a数据域的指数大于b的指数
            r->coef = a->coef;  // 新节点的数据域的底数等于a的底数
            r->exp = a->exp;
            a = a->next;    // a指向a链表的下一个节点
        } else {    // 若a数据域的指数大于b的指数
            r->coef = b->coef;  // 新节点的数据域的底数等于b的底数
            r->exp = b->exp;
            b = b->next;    // a指向a链表的下一个节点
        }
        if (!c) {
            c = r;
        } else {
            p->next = r;
        }
        p = r;
    }
    for (polyNode* r; a; a = a->next) { // 若推出循环后b到达链表末尾而a未到达
        r = new polyNode{a->coef, a->exp, a->next};
        p->next = r;
        p = r;
    }
    for (polyNode* r; b; b = b->next) { // 若推出循环后a到达链表末尾而b未到达
        r = new polyNode{b->coef, b->exp, b->next};
        p->next = r;
        p = r;
    }
    return c;
}
  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

Benson_zjl

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值