在用线性表来解决一元多项式的相关问题时为了节约存储空间并不需要去存储
线性表中的每一项记录,特别是系数项为0的项,所以采用办法是只需存储每一项的系数
线性表中的每一项记录,特别是系数项为0的项,所以采用办法是只需存储每一项的系数
(非0才存储)和相对应的指数即可。
在这种解决办法中的线性表有两种存储结构,一种是顺序存储另一种是线性存
储,这两中存储结构对于一元多项式来说各有优缺点,其中顺序存储的线性表的最大的优
点是支持快速的随机存储,但不利于修改,特别是增加或删除的代价较大,所以只需对多项
式进行求值等不改变多项式的系数和指数的运算时,多采用顺序存储的线性表表示,否则多用链式存储的线性表解决。
在本篇博客中只先述顺序存储的线性表表示,至于链式存储的线性表解决下一篇
博客再说吧!
#include<iostream>
#define LIST_INIT_SIZE 100 //初始分配量
#define LISTINC 50 //增长量
using namespace std;
struct LNode{ //节点类
double p;//系数项
int e;//指数项
};
struct SqList //顺序存储线性表类
{
SqList()
{
elem = (LNode *)malloc(LIST_INIT_SIZE*sizeof(LNode));;
capacity = LIST_INIT_SIZE;
size = 0;
mx = 0;
}
LNode * elem;
size_t size;//项数
size_t capacity;//当前存储容量
double mx;
};
//链表扩充函数
bool EnlargeList(SqList & list)
{
LNode * newbase;
newbase = (LNode *)realloc(list.elem,(list.capacity + LISTINC)*sizeof(LNode));
if(!newbase)
{
return false;
}
list.elem = newbase;
list.capacity += LISTINC;
return true;
}
//初始化一元多项式线性表中的系数项、指数项
void InitList(SqList & list1,double ps[],int es[],int n)//ps代表系数项数组,es代表指数项数组,n代表该一元多项式的个数
{
int i =0;
for(;i<n;i++)
{
if(list1.size>=list1.capacity)
{
EnlargeList(list1);
}
list1.elem[list1.size].p = ps[i];
list1.elem[list1.size].e = es[i];
list1.size++;
}
}
//计算该一元多项式结果
double GetResult(SqList & list1)
{
double sum =0;
for(size_t i=0;i<list1.size;i++)
{
sum+= list1.elem[i].p*(pow(list1.mx,list1.elem[i].e));
}
return sum;
}
//清空一个一元多项式线性表
void clear(SqList & list1)
{
list1.size = 0;
//如果空间过大将空间进行压缩
if(list1.capacity>LIST_INIT_SIZE)
{
free(list1.elem);
list1.elem = (LNode *)malloc(LIST_INIT_SIZE*sizeof(LNode));;
list1.capacity = LIST_INIT_SIZE;
list1.size = 0;
list1.mx = 0;
}
}
int main()
{
//建立一个线性表
SqList myList;
int n;
cout<<"输入该一元多项式的项数:"<<endl;
cin>>n;
//保存系数项和指数项
double* ps = new double[n];//系数项
int* es = new int[n];//指数项
//输入数据
int i = 0;
cout<<"依次输入系数和对应指数,共";
cout<<n<<"对"<<endl;
while (i<n)
{ cin>>ps[i]>>es[i];
i++;
}
cout<<"输入该一元多项式的变量x值"<<endl;
cin>>myList.mx;
//初始化线性表
InitList(myList,ps,es,n);
//计算结果
double s = GetResult(myList);
i=0;
for( i=0;i<int(myList.size-1);i++)
{
cout<< myList.elem[i].p<<"*"<<myList.mx<<"^"<<myList.elem[i].e<<"+";
}
cout<< myList.elem[i].p<<"*"<<myList.mx<<"^"<<myList.elem[i].e<<" = ";
cout<<s<<endl;
return 0;
}