/*多项式的建立及加法*/
#include<iostream>
using namespace std;struct node
{
int coefficient; //系数
int exponent; //指数
node *next;
};
class polynomial //多项式
{
public:
int value; //value记录多项式的值
node *head,*p,*s;
public:
polynomial(){head=NULL;} //构造函数
void InitPoly(); //建立多项式
void output(); //打印多项式
int count(int x); //计算多项式
};
void polynomial::InitPoly() //建立多项式
{
int x,y; //x记录该项的系数,y记录该项的指数
p=head;
while(1)
{
s=new node(); //动态分配新的节点记录 项
cout<<"coefficient: ";
cin>>x;
if(x==0)break; //当输入系数为0时退出多项式创建函数
s->coefficient=x;
cout<<"exponent: ";
cin>>y;
s->exponent=y;
if(head==NULL)
p=head=s;
else
{ p->next=s;
p=p->next;}
}
cout<<endl;
}
void polynomial::output()
{
cout<<"多项式为:";
for(p=head;p!=NULL;p=p->next)
if(p->coefficient!=0) //该项系数为0则不打印该项
{cout<<p->coefficient<<"*x^"<<p->exponent<<" ";}
cout<<endl;
}
int polynomial::count(int x)
{
int v=1;
value=0;
for (p=head;p!=NULL;p=p->next)
{
for(int j=0;j<p->exponent;++j)
v*=x;
value+=p->coefficient*v; //将每项的值累加起来
v=1;
}
return value; //返回该多项式的值
}
void AddPol(polynomial A,polynomial B);
int main( )
{
int x,v;
node *p;
polynomial A,B;
A.InitPoly();
A.output();
B.InitPoly();
B.output();
AddPol(A,B);
A.output();
cout<<"x=";
cin>>x;
v=A.count(x);
cout<<v<<endl;
while (1){}
return 0;
}
void AddPol(polynomial A,polynomial B) //多项式加法:A=A+B,利用两个多项式的节点构成“和多项式”。
{
node *pa,*pb,*temp;
pa=new node();
pb=new node();
pa->next=A.head;
pb->next=B.head;
while(pa->next&&pb->next) //当pa和pb指向的下一个节点不为空时
{
if(pa->next->exponent<pb->next->exponent)//若pa指向的下一个节点的指数小于和pb指向的下一个节点的指数
pa=pa->next; //pa后移一位
else if(pa->next->exponent>pb->next->exponent)//若pa指向的下一个节点的指数大于和pb指向的下一个节点的指数
{
temp=new node(); //动态分配一个临时节点
temp->coefficient=pb->next->coefficient; //将pb的下一个节点中的系数和指数赋给临时节点
temp->exponent=pb->next->exponent;
temp->next=pa->next; //将临时节点插入pa和pa的下一个节点之间
pa->next=temp;
pa=pa->next;
pb=pb->next;
}
else //若pa指向的下一个节点的指数等于和pb指向的下一个节点的指数
{
pa->next->coefficient+=pb->next->coefficient; //把pa和pb下一个节点的系数相加
pa=pa->next;
pb=pb->next;
}
}
while(pb->next) //若pb的下一个节点还不为空,将B剩下的项链接在A的后面
{
pa->next=pb;
pa=pa->next;
pb=pb->next;
}
}
————————————————————————————————————————————————————
/*算法2.22*/
void polynomial::InitPoly() //建立多项式
{
int x,y; //x记录该项的系数,y记录该项的指数
p=head;
while(1)
{
s=new node(); //动态分配新的节点记录 项
cout<<"coefficient: ";
cin>>x;
if(x==0)break; //当输入系数为0时退出多项式创建函数
s->coefficient=x;
cout<<"exponent: ";
cin>>y;
s->exponent=y;
if(head==NULL)
p=head=s;
else
{ p->next=s;
p=p->next;}
}
cout<<endl;
}
/*算法2.23*/
void AddPol(polynomial A,polynomial B) //多项式加法:A=A+B,利用两个多项式的节点构成“和多项式”。
{
node *pa,*pb,*temp;
pa=new node();
pb=new node();
pa->next=A.head;
pb->next=B.head;
while(pa->next&&pb->next) //当pa和pb指向的下一个节点不为空时
{
if(pa->next->exponent<pb->next->exponent)//若pa指向的下一个节点的指数小于和pb指向的下一个节点的指数
pa=pa->next; //pa后移一位
else if(pa->next->exponent>pb->next->exponent)//若pa指向的下一个节点的指数大于和pb指向的下一个节点的指数
{
temp=new node(); //动态分配一个临时节点
temp->coefficient=pb->next->coefficient; //将pb的下一个节点中的系数和指数赋给临时节点
temp->exponent=pb->next->exponent;
temp->next=pa->next; //将临时节点插入pa和pa的下一个节点之间
pa->next=temp;
pa=pa->next;
pb=pb->next;
}
else //若pa指向的下一个节点的指数等于和pb指向的下一个节点的指数
{
pa->next->coefficient+=pb->next->coefficient; //把pa和pb下一个节点的系数相加
pa=pa->next;
pb=pb->next;
}
}
while(pb->next) //若pb的下一个节点还不为空,将B剩下的项链接在A的后面
{
pa->next=pb;
pa=pa->next;
pb=pb->next;
}
}