数据结构 P42-43 算法实现 多项式的建立及加法

30 篇文章 0 订阅
29 篇文章 0 订阅

/*多项式的建立及加法*/

#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;
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值