数据结构多项式

using namespace std;
#include
#include
#include
#include "stdio.h"
using namespace std;
struct LinkNode //多项式结点
{
int E; //指数
int A; //系数
LinkNode *link; //结点指针
LinkNode(float a,int e,LinkNode *p=NULL) //构造函数
{
E=e;
A=a;
link=p;
}
};

class Poly //多项式类
{
private:
LinkNode *first; //首结点地址
public:
Poly()
{
first=new LinkNode(0,-1); //构造函数
}
Poly(Poly &p); //复制构造函数
Poly &operator=(Poly &p); //赋值函数
~Poly()
{
makeEmpty(); //析构函数
}
int Max1(); //返回最大指数
int Length(); //返回多项式长度
void makeEmpty(); //清空链表中的元素
void Input(int flag); //输入函数
void Output(); //输出函数
void operator+(Poly &b);//多项式相加
void operator-(Poly &b); //多项式相减
void operator*(Poly &b); //多项式相乘
friend void der(Poly l); //多项式导数
friend void cal(Poly l,int z); //算值
};


void cal(Poly l,int z)
{
LinkNode *p=l.first->link;
int count1=0;
int y=z;
while(p!=NULL)
{
int x=p->A;
while(p->E--)
{
x*=y;
}
count1+=x;
p=p->link;
}
cout<}
void Poly::makeEmpty()
{
LinkNode *p=NULL;
while(first->link!=NULL)
{
p=first->link;
first->link=p->link;
delete p;
}
}

Poly::Poly(Poly &p)
{
first=new LinkNode(0,-1);
LinkNode *tem=first;
int a;
int e;
LinkNode *ptr=p.first;
while(ptr->link!=NULL)
{
a=ptr->link->A;
e=ptr->link->E;
tem->link=new LinkNode(a,e);
ptr=ptr->link;
tem=tem->link;
}
}

Poly& Poly::operator=(Poly &p)
{
first=new LinkNode(0,-1);
LinkNode *tem=first;
int a;
int e;
LinkNode *ptr=p.first;
while(ptr->link!=NULL)
{
a=ptr->link->A;
e=ptr->link->E;
tem->link=new LinkNode(a,e);
ptr=ptr->link;
tem=tem->link;
}
return *this;
}

void Poly::Input(int flag)
{
LinkNode *p=this->first;
int a;
int b;
while(flag--)
{
cin>>a>>b;
if(fabs(a)<=1e-7||b==-1)
{
continue;
}
if(b==-11)
{
break;
}
p->link=new LinkNode(a,b);
p=p->link;
}
}

int Poly::Max1()
{
LinkNode *ptr=first; //若为first-link,则最后一个为null,
//null->E不存在
while(ptr->link!=NULL)
{
ptr=ptr->link;
}
return ptr->E;
}

int Poly::Length()
{
LinkNode *ptr=this->first;
int count1=0;
while(ptr->link!=NULL)
{

count1++;
ptr=ptr->link;
}
return count1;
}

void Poly::Output()
{
LinkNode *p1=this->first->link;
if(p1->A>0)
{
if(p1->A!=1)
{
cout<A;
if(p1->E==1) cout<<"X";
else if(p1->E>1) cout<<"X^"<E;
}
else
{
if(p1->E==1) cout<<"X";
else if(p1->E>1) cout<<"X^"<E;

}
}
else if(p1->A<0)
{
cout<A;
if(p1->E==1) cout<<"X";
else if(p1->E>1) cout<<"X^"<E;
}
p1=p1->link;
while(p1!=NULL)
{
if(p1->A>=2)
{
cout<<"+"<A;
if(p1->E==1) cout<<"X";
else if(p1->E>1) cout<<"X^"<E;
}
else if(p1->A==1)
{
cout<<"+";
if(p1->E==1) cout<<"X";
else if(p1->E>1) cout<<"X^"<E;
}
else if(p1->A<0)
{
cout<A;
if(p1->E==1) cout<<"X";
else if(p1->E>1) cout<<"X^"<E;
}
p1=p1->link;
}
cout<}

void Poly::operator+(Poly &b)
{
Poly temp;
LinkNode *pa=first->link;
LinkNode *pb=b.first->link;
LinkNode *pc=temp.first;
LinkNode *ptr=NULL;
float f;
while(pa!=NULL&&pb!=NULL)
{
if(pa->E==pb->E)
{
f=pa->A+pb->A;
if(fabs(f)>1e-2)
{
pc->link=new LinkNode(f,pa->E);
pc=pc->link;
}
pa=pa->link;
pb=pb->link;
}
else if(pa->E>pb->E)
{
pc->link=new LinkNode(pb->A,pb->E);
pc=pc->link;
pb=pb->link;
}
else
{
pc->link=new LinkNode(pa->A,pa->E);
pc=pc->link;
pa=pa->link;
}
}
if(pa!=NULL) ptr=pa;
else ptr=pb;
while(ptr!=NULL)
{

pc->link=new LinkNode(ptr->A,ptr->E);
pc=pc->link;
ptr=ptr->link;

}
temp.Output();
}

void Poly::operator-(Poly &b)
{
Poly temp;
LinkNode *ptr=NULL;
LinkNode *pa=this->first->link;
LinkNode *pb=b.first->link;
LinkNode *pc=temp.first;
float f;
int flag=1;
while(pa!=NULL&&pb!=NULL)
{
if(pa->E==pb->E)
{
f=pa->A-pb->A;
if(fabs(f)>1e-2)
{
pc->link=new LinkNode(f,pa->E);
pc=pc->link;
}
pa=pa->link;
pb=pb->link;
}
else if(pa->E>pb->E)
{
pc->link=new LinkNode(-(pb->A),pb->E);
pc=pc->link;
pb=pb->link;
}
else
{
pc->link=new LinkNode(pa->A,pa->E);
pc=pc->link;
pa=pa->link;
}
}
if(pa==NULL)
{
pt

r=pb;
flag=0;
}
else ptr=pa;
while(ptr!=NULL)
{
if(flag==1)
pc->link=new LinkNode(ptr->A,ptr->E);
else
pc->link=new LinkNode(-(ptr->A),ptr->E);
ptr=ptr->link;
pc=pc->link;
}
temp.Output();
}

void Poly::operator*(Poly &b)
{
int ma=this->Max1();
int mb=b.Max1();
int k;
int max1=ma+mb;
Poly temp;
LinkNode *pa=this->first->link;

LinkNode *pc=temp.first;
if(ma!=-1&&mb!=-1)
{
float *f=new float[ma+mb+1];
for(int i=0; i<=max1; i++) f[i]=0;
while(pa!=NULL)
{
LinkNode *pb=b.first->link;
while(pb!=NULL)
{
k=pa->E+pb->E;
f[k]=f[k]+(pa->A)*(pb->A);
pb=pb->link;
}
pa=pa->link;
}
for(int i=0; i<=max1; i++)
{
if(fabs(f[i])>0.01)
{
pc->link=new LinkNode(f[i],i);
pc=pc->link;
}
}
delete []f;
}
pc->link=NULL;
temp.Output();
}

void der(Poly l)
{
Poly temp;
LinkNode *p=l.first->link;
LinkNode *ptr=temp.first;
while(p!=NULL)
{
if((p->E)>0)
{
float f=p->A*p->E;
int e=p->E-1;
ptr->link=new LinkNode(f,e);
ptr=ptr->link;
}
p=p->link;
}
temp.Output();
}
int main()
{
freopen("111111","r",stdin);
Poly x;
int a;
cin>>a;
x.Input(a);
Poly y;
cin>>a;
y.Input(a);
cout<<"A(x)+B(x)=";
x+y;
cout<<"A'(x)=";
der(x);
cout<<"A(1)=";
cin>>a;
cal(x,a);
return 0;
}

相关文档
最新文档