题目描述
写一个算法,实现两个稀疏多项式相加。
本题源于教材第46页的案例2.2。
在不完整程序中,请将AddPolyn()定义完整。函数首部:void AddPolyn(Polynomial &Pa,Polynomial &Pb)
不完整程序
#include<iostream>
using namespace std;
typedef struct PNode{
float coef; //系数
int expn; //指数
struct PNode *next;
}PNode,*Polynomial;
void AddPolyn(Polynomial &Pa,Polynomial &Pb); //函数声明
void CreatPolyn(Polynomial &P,int m) //算法2.18 多项式的创建
{
//输入m项的系数和指数,建立表示一个多项式的有序链表P
PNode *q,*pre,*s;
int i;
P=new PNode;
P->next=NULL; //先建立一个带头结点的单链表
for(i=1;i<=m;i++) //依次输入m个非零项
{
s=new PNode; //生成新结点
cin>>s->coef>>s->expn; //输入元素值
pre=P; //pre用于保存q的前驱,初值为头结点
q=P->next;
while(q && q->expn < s->expn)//通过比较指数找到第一个大于输入项指数的项q
{
pre=q;
q=q->next;
} //while
s->next=q; //将输入项s插入到q和其前驱结点pre之间
pre->next=s;
} //for
} //CreatPolyn
//AddPolyn
//完成AddPolyn(()函数的定义,函数首部见前面的“函数声明”
/********************** begin *********************/
/********************** end *********************/
int main()
{
Polynomial Pa,Pb;
PNode *p;
int temp,i;
//创建多项式Pa
//cout<<"请输入多项式Pa的项数:";
cin>>temp; //输入多项式Pa的个数
//cout<<"请输入多项式Pa的系数和指数,中间用一个空格隔开,一个项一行:\n";
CreatPolyn(Pa,temp); //调用函数,输入Pa每一项的系数和指数
//创建多项式Pb
//cout<<"请输入多项式Pb的项数:";
cin>>temp; //输入多项式Pa的个数
//cout<<"请输入多项式Pb的系数和指数,中间用一个空格隔开,一个项一行:\n";
CreatPolyn(Pb,temp); //调用函数,输入Pa每一项的系数和指数
AddPolyn(Pa,Pb);
//cout<<"多项式Pa和Pb相加后的结果是:\n";
p=Pa->next;
i=0;
while(p) //输出相加后的结果,每一项以x^n表示
{
if(i)
cout<<" + ";
cout<<"("<<p->coef<<") * x^"<<p->expn;
p=p->next;
i=1;
}
cout<<endl;
return 0;
}
输入
第一行请输入多项式Pa的项数n
然后输入n行,每行输入一项多项式Pa的系数和指数,中间用一个空格隔开
第n+2行请输入多项式Pb的项数m
然后输入m行,每行输入一项多项式Pb的系数和指数,中间用一个空格隔开
输出
依照如下格式输出多项式Pa和Pb相加后的结果:
(7) * x^0 + (11) * x^1 + (22) * x^7 + (5) * x^17
样例输入
4
7 0
3 1
9 8
5 17
3
8 1
22 7
-9 8
样例输出
(7) * x^0 + (11) * x^1 + (22) * x^7 + (5) * x^17
代码实现
#include<iostream>
using namespace std;
typedef struct PNode{
float coef; //系数
int expn; //指数
struct PNode *next;
}PNode,*Polynomial;
void AddPolyn(Polynomial &Pa,Polynomial &Pb); //函数声明
void CreatPolyn(Polynomial &P,int m) //算法2.18 多项式的创建
{
//输入m项的系数和指数,建立表示一个多项式的有序链表P
PNode *q,*pre,*s;
int i;
P=new PNode;
P->next=NULL; //先建立一个带头结点的单链表
for(i=1;i<=m;i++) //依次输入m个非零项
{
s=new PNode; //生成新结点
cin>>s->coef>>s->expn; //输入元素值
pre=P; //pre用于保存q的前驱,初值为头结点
q=P->next;
while(q && q->expn < s->expn)//通过比较指数找到第一个大于输入项指数的项q
{
pre=q;
q=q->next;
} //while
s->next=q; //将输入项s插入到q和其前驱结点pre之间
pre->next=s;
} //for
} //CreatPolyn
//AddPolyn
//完成AddPolyn(()函数的定义,函数首部见前面的“函数声明”
/********************** begin *********************/
void AddPolyn(Polynomial &Pa,Polynomial &Pb)
{
PNode *p1,*p2,*p3,*r;
p1=Pa->next;
p2=Pb->next;
p3=Pa;
float sum;
while(p1&&p2){
if(p1->expn == p2->expn){ //指数相等
sum = p1->coef + p2->coef; // 系数求和
if(sum!=0){ //判断系数和是否为0,不为0则
p1->coef = sum; //修改pa当前指向节点 的系数值为两项系数之和
p3->next=p1; //将修改后的 pa 当前指向结点 链接在 p3 之后 ,p3指向p1
p3=p1;
p1=p1->next; //p1后移
r=p2; p2=p2->next; delete r; //删除p2当前节点
}
else { //此处系数为 0 ,则p1 p2都后移
r=p1; p1=p1->next; delete r;
r=p2; p2=p2->next; delete r;
}
}
else if(p1->expn < p2->expn){
p3->next=p1;
p3=p1;
p1=p1->next;
}
else {
p3->next=p2;
p3=p2;
p2=p2->next;
}
}
p3->next=p1?p1:p2;
delete Pb;
}
/********************** end *********************/
int main()
{
Polynomial Pa,Pb;
PNode *p;
int temp,i;
//创建多项式Pa
//cout<<"请输入多项式Pa的项数:";
cin>>temp; //输入多项式Pa的个数
//cout<<"请输入多项式Pa的系数和指数,中间用一个空格隔开,一个项一行:\n";
CreatPolyn(Pa,temp); //调用函数,输入Pa每一项的系数和指数
//创建多项式Pb
//cout<<"请输入多项式Pb的项数:";
cin>>temp; //输入多项式Pa的个数
//cout<<"请输入多项式Pb的系数和指数,中间用一个空格隔开,一个项一行:\n";
CreatPolyn(Pb,temp); //调用函数,输入Pa每一项的系数和指数
AddPolyn(Pa,Pb);
//cout<<"多项式Pa和Pb相加后的结果是:\n";
p=Pa->next;
i=0;
while(p) //输出相加后的结果,每一项以x^n表示
{
if(i)
cout<<" + ";
cout<<"("<<p->coef<<") * x^"<<p->expn;
p=p->next;
i=1;
}
cout<<endl;
return 0;
}