多项式的每一项需要两个参数,即系数与指数。描述多项式的一种方式是用数组的下标表示项的指数,而用数组存储的元素表示相应项的系数。这样表示的多项式看起来很简单,但是在很多计算中却显得很不方便,这种不方便主要出现”在稀疏的“多项式中(比如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