#include
using namespace std;
struct LNode{ //节点类
double p;//系数项
int e;//指数项
LNode * next;
};
class LsList{//一元多项式链式线性表
private:
LNode head;//头结点
size_t size;//节点个数
double mx;//一元多项式的变量值
public:
LNode & GetHead(){return head;}
size_t & GetSize(){return size;}
size_t GetSize() const {return size;}
LsList()
{//初始化一个空的线性表
size = 0;
head.next = 0;
mx = 0;
}
//初始化一元多项式线性表中的系数项、指数项
LsList(double ps[],int es[],int n)//ps代表系数项数组,es代表指数项数组,n代表该一元多项式的个数
{
size = 0;
head.next = 0;
mx = 0;
int i =0;
LNode * p = &head;
for(;i
e = es[i];
p1->p = ps[i];
p->next = p1;
p = p->next;
size++;
}
p->next = 0;
}
//复制构造函数
LsList(LsList &list2)
{
size = 0;
head.next = 0;
mx = 0;
LNode * p = &head;
LNode *p1 = list2.GetHead().next;
while(p1!=0)
{
LNode * p2 = (LNode*)malloc(sizeof(LNode));
p2->e = p1->e;
p2->p = p1->p;
p->next = p2;
p1 = p1->next;
p = p->next;
size++;
}
p->next = 0;
}
//赋值操作符重载
LsList & operator=(LsList &list2)
{
clear();
LNode * p = &head;
LNode *p1 = list2.GetHead().next;
while(p1!=0)
{
LNode * p2 = (LNode*)malloc(sizeof(LNode));
p2->e = p1->e;
p2->p = p1->p;
p->next = p2;
p1 = p1->next;
p = p->next;
size++;
}
p->next = 0;
return *this;
}
//设置该一元多项式的变量值X
void SetX(double d)
{
mx = d;
}
//清空一个线性表
void clear()
{
LNode * p = head.next;
while(p!=0)
{
LNode * p2 = p->next;
free(p);
p = p2;
}
size = 0;
head.next = 0;
mx = 0;
}
//打印该一元线性表
void PrintLsList()
{
if(mx==0)
{
cout<<"请先设置变量x值"<
p<<"*"<
e; p = p->next; if(p!=0&&p->p>0) cout<<"+"; } } //计算该一元多项式结果 double GetResult() { double sum =0; if(mx==0) { cout<<"请先设置变量x值"<
p)*pow(mx,p->e); p = p->next; } return sum; } //删除多项式中的某一项数据 bool DeleElem(int e) { LNode * p1 = &head; LNode * p = p1->next; while(p!=0) { if(p->e==e) { p1->next = p->next; free(p); size--; return true; } p1 = p1->next; p = p1->next; } return false; } //给多项式添加一项数据 void AddElem(double pi,int ei) { LNode * p = head.next; if(p==0) { LNode * p2 = (LNode*)malloc(sizeof(LNode)); p2->e =ei; p2->p = pi; head.next = p2; size++; p2->next = 0; return; } if(p->e>ei) { LNode * p2 = (LNode*)malloc(sizeof(LNode)); p2->e =ei; p2->p = pi; head.next = p2; p2->next = p; size++; return; } while(p!=0) { if(p->e == ei) { if(( p->p + pi)==0) { DeleElem(ei);//删除 return; } else { p->p += pi; return; } } if((p->e
next!=0 && p->next->e>ei)||(p->e
next==0)) { LNode * p2 = (LNode*)malloc(sizeof(LNode)); p2->e =ei; p2->p = pi; p2->next = p->next; p->next = p2; size++; return ; } p = p->next; } } //完成多项式的相加运算,并销毁多项式list2 void AddList(LsList &list2) { int s1 = size; int n=0; size =0; LNode * p1 = head.next; LNode * p = &head; LNode * p2 = list2.GetHead().next; while(p1!=0&&p2!=0) { if(p1->e < p2->e) { p->next = p1; p1 = p1->next; p = p->next; size++; } else { if(p1->e > p2->e) { p->next = p2; p2 = p2->next; p = p->next; size++; } else{ double db = (p1->p)+(p2->p); if(db!=0) { p1->p = db; p->next = p1; p = p->next; size++; p1 = p1->next; LNode * p3 = p2->next; free(p2); p2=p3; size++; } if(db==0) { LNode * pa = p1->next; LNode * pb = p2->next; free(p1); free(p2); p1 = pa; p2 = pb; n++; } } } } if(p1==0) { p->next = p2; size += list2.GetSize() - size - n; } else { p->next = p1; size += s1 - size - n; } list2.GetHead().next = 0; } //完成多项式的相减运算,并销毁多项式list2 void Sub(LsList &list2) { LNode *p = list2.GetHead().next; while(p!=0) { p->p = -(p->p); p = p->next; } AddList(list2); } //完成多项式的相乘运算,并销毁多项式list2 void Mul(LsList &list2) { LNode *p = list2.GetHead().next; LsList ili = *this; while(p!=0) { LsList li = ili; for(LNode * p1 = li.GetHead().next;p1