数据结构 P42-43 算法实现 多项式的建立及加法
2017-10-14 09:17
507 查看
/*多项式的建立及加法*/
#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;
}
}
#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;
}
}
相关文章推荐
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算
- 【数据结构_链表_List_1040】一元多项式加法运算的实现
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 数据结构第二次上机实验【链表实现多项式的加法和乘法】
- 一元多项式的加法和乘法运算(Java实现)——浙大数据结构(陈越)
- 数据结构课后习题 实现多项式的加法 c语言版
- 【数据结构】C++链表实现一元多项式的加法
- Java数据结构之多项式加法和乘法实现
- 数据结构与算法——有向无环图的拓扑排序C++实现
- 算法与数据结构基础6:C++队列的简单实现
- 【数据结构】有向图、无向图以及最短路(Dijkstra)算法的C#实现(Template模式)
- [算法与数据结构] - No.7 二叉树建立及其前序、中序、后序遍历
- C语言:用链表实现一元多项式的加法
- 【算法和数据结构】排序(二)选择排序(C++实现)
- 【LeetCode-面试算法经典-Java实现】【067-Add Binary(二进制加法)】
- 散列表查找的代码实现 - 数据结构和算法86
- 数据结构与算法之三(栈和队列的java实现)
- 数据结构与算法——最短路径Dijkstra算法的C++实现
- 麻将查胡算法 数据结构设计与实现
- 基础算法,大数加法和乘法的实现