数据结构(王卓--案例分析(多项式的创建&相加)

C++代码实现

#include <iostream>
#include <algorithm> // max
using namespace std;

static int n; // 用以记录多项式相加后的剩余项数

template <class T>
class PNode
{
private:
    T coef;      // 系数
    int expen;   // 指数
    PNode *next; // 指针域
    typedef PNode *Polynomial;

public:
    // 多项式的创建
    void CreatePolyn(Polynomial &head_ptr, int n) // n项多项式,建立有序链表
    {
        head_ptr = new PNode;
        head_ptr->next = NULL; // first:建立带头结点的指针

        for (int i = 1; i <= n; ++i) // 依次输入n个非零项
        {
            PNode *new_ptr = new PNode;
            cout << "分别输入第" << i << "项的系数和指数:";
            cin >> new_ptr->coef >> new_ptr->expen;                // 输入系数和指针
            PNode *pre_ptr = head_ptr;                             // pre用于保存p的前驱,初值为头结点
            PNode *curry_ptr = head_ptr->next;                     // q的初始化:指向首元结点
            while (curry_ptr && curry_ptr->expen < new_ptr->expen) // 当输入的指数大于当前指针(q)指向的指数
            {
                pre_ptr = curry_ptr;
                curry_ptr = curry_ptr->next;
            }
            new_ptr->next = curry_ptr;
            pre_ptr->next = new_ptr;
        }
    }

    // 输出多项式的coef&expn
    void OutCoefExpn(PNode *&head_ptr, int n)
    {
        PNode *imd_ptr = head_ptr;
        int i = 0;
        while (imd_ptr && i < n)
        {
            imd_ptr = imd_ptr->next; // imd_ptr为中间指针
            cout << "多项式第" << (i + 1) << "项的系数&指数:"
                 << "(" << imd_ptr->coef << "," << imd_ptr->expen << ")"
                 << "  ";
            i++;
        }
        cout << endl;
    }

    // 输出表达式
    void OutExpression(PNode *&head_ptr, int n)
    {
        PNode *imd_ptr = head_ptr;
        int i = 0;
        cout << "函数表达式:F(x)= ";
        while (imd_ptr && i < n)
        {
            imd_ptr = imd_ptr->next;
            cout << "(" << imd_ptr->coef << "x"
                 << "^" << imd_ptr->expen << ")";
            if (i < n - 1)
                cout << "+";
            i++;
        }
        cout << endl;
    }

    // 多项式的相加
    void AddPolyn(Polynomial &Polyn1Head_ptr, Polynomial &Polyn2Head_ptr)
    {
        PNode *p1 = Polyn1Head_ptr->next, *p2 = Polyn2Head_ptr->next, *p3 = Polyn1Head_ptr;
        PNode *imd_ptr; // 中间指针

        while (p1 && p2)
        {
            if (p1->expen == p2->expen) // 等于
            {
                T sum = p1->coef + p2->coef;
                if (sum != 0) // 对应的项和不为0
                {
                    p1->coef = sum;
                    p3->next = p1;
                    // TODO: p3 = p1;
                    p3 = p3->next;
                    p1 = p1->next; // p1指向后一项
                    imd_ptr = p2;
                    p2 = p2->next;  // p2指向后一项目
                    delete imd_ptr; // 释放掉当前的结点
                }
                else // 对应的项和为0
                {
                    imd_ptr = p1;
                    p1 = p1->next;
                    delete imd_ptr;
                    imd_ptr = p2;
                    p2 = p2->next;
                    delete imd_ptr;
                    n--;
                }
            }
            else if (p1->expen < p2->expen) // 小于
            {
                p3->next = p1;
                // TODO: p3 = p1;
                p3 = p3->next;
                p1 = p1->next;
            }
            else
            {
                p3->next = p2;
                // TODO: p3 = p2;
                p3 = p3->next;
                p2 = p2->next;
            }
        }
        p3->next = p1 ? p1 : p2;
        delete Polyn2Head_ptr;
    }

    void TestOut(Polynomial &head_ptr)
    {
        cout << "(" << head_ptr->next->coef << "," << head_ptr->next->expen << ")"
             << "  "
             << "(" << head_ptr->next->next->coef << "," << head_ptr->next->next->expen << ")" << endl;
    }
};

int main()
{

    PNode<int> polyn1, polyn2, polyn3, *Polyn1Head_ptr, *Polyn2Head_ptr; // p指向头结点
    int num1, num2;                                                      // 要创建的多项式的系数
    cout << "输入要创建的第一个多项式的项数:";
    cin >> num1;
    polyn1.CreatePolyn(Polyn1Head_ptr, num1);
    polyn1.OutCoefExpn(Polyn1Head_ptr, num1);
    polyn1.OutExpression(Polyn1Head_ptr, num1);

    cout << "输入要创建的第二个多项式的项数:";
    cin >> num2;
    polyn2.CreatePolyn(Polyn2Head_ptr, num2);
    polyn2.OutCoefExpn(Polyn2Head_ptr, num2);
    polyn2.OutExpression(Polyn2Head_ptr, num2);

    n = max(num1, num2);
    polyn3.AddPolyn(Polyn1Head_ptr, Polyn2Head_ptr);
    // polyn3.TestOut(Polyn1Head_ptr);
    polyn3.OutCoefExpn(Polyn1Head_ptr, n);
    polyn3.OutExpression(Polyn1Head_ptr, n);
}

代码运行效果1

输入:
f 1 ( x ) = x + 2 x 2 + 3 x 3 f_{1}(x)=x+2 x^{2}+3 x^{3} f1(x)=x+2x2+3x3 f 2 ( x ) = x + 2 x 2 + 3 x 3 + 4 x 4 f_{2}(x)=x+2 x^{2}+3 x^{3}+4 x^{4} f2(x)=x+2x2+3x3+4x4
输出: f ( x ) = 2 x + 4 x 2 + 6 x 3 + 4 x 4 f(x)=2x+4x^{2}+6 x^{3}+4 x^{4} f(x)=2x+4x2+6x3+4x4

在这里插入图片描述

代码运行效果2

输入: f 1 ( x ) = − 1 x − 2 x 2 + 3 x 3 f_{1}(x)=-1x-2 x^{2}+3 x^{3} f1(x)=1x2x2+3x3 f 2 ( x ) = x + 2 x 2 + 3 x 3 + 4 x 4 f_{2}(x)=x+2 x^{2}+3 x^{3}+4 x^{4} f2(x)=x+2x2+3x3+4x4
输出: f ( x ) = 6 x 3 + 4 x 4 f(x)=6 x^{3}+4 x^{4} f(x)=6x3+4x4

在这里插入图片描述

如果程序存在bug,欢迎指出,定当虚心接受批评

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinloonga

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值