手把手教你用C/C++实现多项式操作

引言

多项式操作是计算机科学和数学领域中的一个重要主题。在计算机科学中,多项式操作常用于代数表达式求解、图形绘制和优化算法等众多领域。本篇博客将分析一个用C++编写的多项式操作代码,该代码实现了多项式的创建、相加和相乘等基本操作。我们将逐步解释这段代码,帮助您理解多项式操作的基本原理以及如何在C++中实现这些操作。

下方获取完整源码

头文件和结构体定义

#include <iostream>
#include <cstdlib>
#include <cmath>

struct term {
    float coef;
    int expn; // 指数
};

struct Lnode {
    term data;
    Lnode* next;
};

typedef Lnode* Link;
typedef Link Linklist;

这部分代码首先包含了必要的头文件,然后定义了两个结构体,term 表示多项式的每一项,包括系数(coef)和指数(expn)。Lnode 表示链表的节点,其中包含了一个 term 数据和一个指向下一个节点的指针。接着定义了 Link 和 Linklist 类型的别名,这是链表的节点和链表本身的别名。

函数实现

比较函数 comp

int comp(...  ...) {
    if (a.expn == b.expn)
        return 0;
    else
        return (a.expn < b.expn) ? -1 : 1;
}

这个函数 comp 用于比较两个 term 结构体,根据指数来判断它们的大小关系。如果 a 和 b 的指数相等,返回0;如果 a 的指数小于 b,返回-1;否则返回1。

插入排序函数 Orderinsert

void Orderinsert(...  ...) {
    Link o, p, q;
    q = L;
    p = q->next;
    while (p && comp(p->data, e) < 0) {
        q = p;
        p = p->next;
    }
    o = new Lnode;
    o->data = e;
    q->next = o;
    o->next = p;
}

这个函数用于将一个 term 结构体按照指数大小插入到链表 L 中的正确位置。它首先从链表头节点开始遍历,找到正确的插入位置,然后创建一个新节点 o,将 e 的数据赋值给 o,再将 o 插入到链表 L 中的正确位置。

查找元素函数 LocateElem

int LocateElem(...) {
    Link p;
    s = L;
    p = s->next;
    while (p && comp(p->data, e) != 0) {
        s = p;
        p = p->next;
    }
    if (!p) {
        s = q = nullptr;
        return 0;
    }
    else {
        q = p;
        return 1;
    }
}

这个函数用于在链表 L 中查找指定的 term 元素 e,并返回查找结果。s 是查找到的元素的前一个节点,q 是查找到的元素的节点。如果找到了元素,返回1;如果没有找到,返回0。

删除下一个元素函数 Delnext

void Delnext(Linklist& L, Link s) {
    Link q = s->next;
    s->next = q->next;
    delete q;
}

这个函数用于删除链表 L 中节点 s 后面的节点,即删除 s->next,然后释放内存。

插入或合并函数 Orderinsertmerge

void Orderinsertmerge(...) {
    Link q, s;
    if (LocateElem(L, e, s, q, comp)) {
        q->data.coef += e.coef;
        if (q->data.coef == 0) {
            Delnext(L, s);
        }
    }
    else
        Orderinsert(L, e, comp);
}

这个函数用于将一个 term 结构体插入或合并到链表 L 中。如果 e 的指数在链表中已存在,则将两者的系数相加,如果系数为0,则删除该节点;否则,将 e 插入到链表 L 中。

创建多项式函数 Creatpolyn

void Creatpolyn(...  ...  ...) {
    term e;
    int i;
    p = new Lnode;
    p->next = nullptr;
    std::cout << "\n请输入" << m << "个系数和指数用空格符间隔: \n";
    for (i = 1; i <= m; i++) {
        std::cin >> e.coef >> e.expn;
        if (e.coef == 0) {
            e.expn = 0;
        }
        Orderinsertmerge(p, e, comp);
    }
}

这个函数用于创建一个多项式,用户需要输入多项式的项数 m 以及每一项的系数和指数。然后根据用户输入,调用 Orderinsertmerge 函数将每一项插入到多项式链表 p 中。

多项式相加函数 add

void add(...  ...  ...) {
    Lc = new Lnode;
    Lc->next = nullptr;
    Link qa, qb;
    term b;
    qb = Lb->next;

    while (qb) {
        b = qb->data;
        Orderinsertmerge(La, b, comp);
        qb = qb->next;
    }
    qa = La->next;
    while (qa) {
        b = qa->data;
        Orderinsertmerge(Lc, b, comp);
        qa = qa->next;
    }
    delete[] Lb;
    if (!Lc->next)
        std::cout << "0";
}

这个函数实现了多项式的相加操作,将链表 La 和 Lb 中的多项式相加,结果存储在链表 Lc 中。具体实现是遍历 Lb 中的项,分别插入到 La 中,然后将结果存储在 Lc 中。最后,删除链表 Lb,如果结果为空则输出 “0”。

多项式相乘函数 multiplication

void multiplication(...  ...  ...) {
    Lc = new Lnode;
    Lc->next = nullptr;
    term e;
    Link p1, p2;
    p1 = La->next;
    p2 = Lb->next;
    while (p1) {
        while (p2) {
            e.coef = (p1->data.coef) * (p2->data.coef);
            e.expn = (p1->data.expn) + (p2->data.expn);
            Orderinsertmerge(Lc, e, comp);
            p2 = p2->next;
        }
        p2 = Lb->next;
        p1 = p1->next;
    }
}

这个函数实现了多项式的相乘操作,将链表 La 和 Lb 中的多项式相乘,结果存储在链表 Lc 中。具体实现是使用两个嵌套循环,遍历 La 和 Lb 中的项,将每一项的系数相乘,指数相加,然后将结果插入到链表 Lc 中。

打印多项式函数 printpolyn

void printpolyn(......) {
    Link v = p->next;

    if (!v) {
        std::cout << "0\n";
        return;
    }

    bool firstTerm = true;

    while (v) {
        if (v->data.coef != 0) {
            if (!firstTerm) {
                if (v->data.coef > 0)
                    std::cout << " + ";
                else
                    std::cout << " - ";
            }
            firstTerm = false;

            if (v->data.expn == 0) {
                std::cout << std::abs(v->data.coef);
            }
            else {
                if (std::abs(v->data.coef) != 1)
                    std::cout << std::abs(v->data.coef);
                if (v->data.expn == 1) {
                    std::cout << "x";
                }
                if (v->data.expn == 0) {
                    std::cout << "";
                }
                else {
                    std::cout << "x^" << v->data.expn;
                }
            }
        }
        v = v->next;
    }

    std::cout << "\n";
}

这个函数用于打印多项式链表 p 中的内容。它遍历链表中的每一项,根据系数和指数的情况输出对应的多项式表达式,包括正负号、系数、指数、和 “x” 符号。如果链表为空,则输出 “0”。

源码获取:官方渠道需要花费积分下载,
公众号:每日推荐系列,回复【多项式】即可免费获取

多项式操作在计算机科学、数学和工程领域都有广泛的应用,例如在信号处理、优化、数据拟合等方面。掌握多项式操作的基本原理对于理解这些领域的应用是非常重要的。希望本文的解析能够帮助您更好地理解多项式操作,并激发您对计算机科学和数学的兴趣。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
符号多项式操作,已经成为表处理的典型用例。在数学上,一个多项式Pn(x)可按升幂写 成: Pn(x) = p0+ p1x+ p2x2+….+ pnxn 它由n+1个系数唯一确定,因此,在计算机里,它可用一个线 性表P来表示: P = (p0 ,p1 ,p2 ,… pn)每一项的指数i隐含在其系数pi的序号里。 假设Qm(x)是一m次多项式,同样可用线性表Q来表示:Q = (q0 ,q1 ,q2 ,… qm)。 不失一般性,设m<n,则两个多项式相加的结果 Rn(x) = Pn(x)+Qm(x)可用线性表R表示:R = (p0+q0 , p1+q1 , p2 +q2 , … , pm +qm , pm+1 ,… pn)。显然,我们可以对P、Q和R采用顺序存储结构, 使得多项式相加的算法定义十分简洁。至此,一多项式表示及相加问题似乎已经解决了。 然而在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难 决定。特别是在处理形如:S(x) = 1+3x10000+2x20000的多项式时,就要用一长度为20001的线性表来 表示,表中仅有三个非零素,这种对内存空间的浪费是应当避免的,但是如果只存储非零系数项 则显然必须同时存储相应的指数。 一般情况下的一n次多项式可写成: Pn(x) = p1x e1 + p2x e2 + … + pmx em 其中 pi,是指数为 ei 的项的非零系数,且满足 0 ≤ e1 < e2 < …< em = n,若用一个长度为 m 且 每个素有两个数据项(系数项和指数项)的线性表便可唯一确定多项式 Pn(x)。 ((p1 ,e1) , (p2 ,e2) , … ,(pm,em)) 在最坏情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多存储一倍的数据。但 是,对于 S(x)类的多项式,这种表示将大大节省空间。 本题要求选用线性表的一种合适的存储结构来表示一个多项式,并在此结构上实现多 项式的加法,减法和乘法操作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Eric,会点编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值