每日一题13:多项式的(基于链表实现)简单运算

多项式的每一项可以需要两个参数,即系数与指数。描述多项式的一种方式是用数组的下标表示项的指数,而用数组存储的元素表示相应项的系数。这样表示的多项式看起来很简单,但是在很多计算中却显得很不方便,这种不方便主要出现”在稀疏的“多项式中(比如x的10000次方加1),如果要输出多项式却要从头到尾扫描数组。另一个缺点是浪费了很多的空间,上面的例子中有效的数组元素仅仅只有两个。所以最好还是用链表表示,每个节
摘要由CSDN通过智能技术生成

多项式的每一项需要两个参数,即系数与指数。描述多项式的一种方式是用数组的下标表示项的指数,而用数组存储的元素表示相应项的系数。这样表示的多项式看起来很简单,但是在很多计算中却显得很不方便,这种不方便主要出现”在稀疏的“多项式中(比如x的10000次方加1),如果要输出多项式却要从头到尾扫描数组。另一个缺点是浪费了很多的空间,上面的例子中有效的数组元素仅仅只有两个。所以最好还是用链表表示,每个节点存储一个项的系数和指数,再加上一个指向下一节点的指针。为了以后运算方便时,在构建时就将各项按指数大小排序,如果从小到大排列,那么当输出多项式时就很不方便,并且这样与数学中多项式的写法也不一致,所以最好是从大到小的排序。

#include "stdafx.h"
#include <iostream>

using namespace std;

struct PolynomialItem
{
    float Coeff;
    int Power;
    PolynomialItem* next;
};

struct Polynomial
{
    int ItemCount;
    PolynomialItem *FirstItem;
    //加入一个lastItem指针,方便函数的编写
    //特别是编写O(M^2N)时间复杂度的Multi算法时
    PolynomialItem *LastItem;
};

数据结构定义好之后,再写一些基本的函数,方便后面编写多项式运算的代码:

PolynomialItem* CreatePolyItem(float Coeff,int Power)
{
    if(Coeff == 0.0f) return NULL;
    PolynomialItem* PolyItem = new PolynomialItem;
    PolyItem->Coeff = Coeff;
    PolyItem->Power = Power;
    PolyItem->next = NULL;
    return PolyItem;
}

PolynomialItem* CopyPolyItem(const PolynomialItem* Item)
{
    if(Item == NULL) return NULL;
    return CreatePolyItem(Item->Coeff,Item->Power);
}

Polynomial* CreateEmptyPolynomial()
{
    Polynomial* Poly = new Polynomial;
    Poly->ItemCount = 0;
    Poly->FirstItem = NULL;
    Poly->LastItem = NULL;
    return Poly;
}

//Append表示不考虑输入Item中Power的值,直接连接到多项式的后面
//不保证插入的节点处在正确的位置上
void AppendPolyItem(Polynomial** Poly,PolynomialItem *Item)
{
    if((*Poly)->ItemCount == 0) 
    {
        (*Poly)->FirstItem = Item;
        (*Poly)->LastItem = Item;
        ++(*Poly)->ItemCount;
        return;
    }
    Item->next = NULL;
    (*Poly)->LastItem->next = Item;
    (*Poly)->LastItem = Item;
    ++(*Poly)->ItemCount;
}

void AppendPolyItem(Polynomial** Poly,float Coeff,int Power)
{
    AppendPolyItem(Poly,CreatePolyItem(Coeff,Power));
}

//Insert会将输入Item安插到正确的位置
void InsertPolyItem(Polynomial** Poly,PolynomialItem *Item)
{
    if((*Poly)->ItemCount == 0)
    {
        AppendPolyItem(Poly,Item);
        return;
    }
    if((*Poly)->FirstItem->Power < Item->Power)
    {
        Item->next = (*Poly)->FirstItem;
        (*Poly)->FirstItem = Item;
        ++(*Poly)->ItemCount;
        return;
    }
    PolynomialItem* p = (*Poly)->FirstItem;
    PolynomialItem* q;
    while(p)
    {
        if(p->Power > Item->Power)
        {
            q = p;
            p = p->next;
        }
        else if(p->Po
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值