题干:
求两个一元多项式 A(x) = a0 + a1x + a2x2 + … + anxn 和 B(x) = b0 + b1x + b2x2 + … + bmxm 的和
基于三个链表的实现
原理讲解:
为一元多项式 A(x)=12+2x+3+3
+6
+7
B(x)=-3+4x+4+6
+7
+8
这样就可以得到一个C(x)=9+6x+3+7
+12
+14
+8
用图形的表示方法如下所示:
A,B,C链表有两个变量一个是系数,一个是指数,如果指数相同,则A,B相加得C
所以定义一个结构体:
typedef struct PNode
{
float coef;
int expn;
struct PNode *next;
}PNode,*Polynomial;
代码分析:
当定义完结构体之后,要创建链表:
void CreatePolyn(Polynomial &P,int n)
{
int i;
Polynomial s,pre,q;
P=new PNode;
P->next=NULL;
//变量n表示链表长度即多项式有多少项
for(i=1;i<=n;++i)
{
s=new PNode;
//输入多项书的指数和系数
cin>>s->coef>>s->expn;
pre=P;
q=P->next;
while(q&&q->expn<s->expn)
{
pre=q;
q=q->next;
}
s->next=q;
pre->next=s;
}
}
当定义完A,B,多项式链表之后,把相同指数的项进行相加操作:
void AddPolyn(Polynomial &L,Polynomial L1,Polynomial L2)
{
Polynomial p1,p2,p,q;
p=L=L1;
//p1为链表1的指针
p1=L1->next;
//p2为链表2的指针
p2=L2->next;
while(p1&&p2)
{
//指数相同的时候系数相加
if(p1->expn==p2->expn)
{
int sum=p1->coef+p2->coef;
if(sum!=0)
{
p1->coef=sum;
p->next=p1;
p=p1;
p1=p1->next;
q=p2;
p2=p2->next;
delete q;
}
else
{
q=p1;
p1=p1->next;
delete q;
q=p2;
p2=p2->next;
delete q;
}
}
else if(p1->expn<p2->expn)
{
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
p->next=p1?p1:p2;
}
最后,输出打印链表,即输出多项式各项:
void output(Polynomial L)
{
Polynomial p=L->next;
while(p)
{
cout<<p->coef<<"x^"<<p->expn;
if(p->next)
cout<<"+";
p=p->next;
}
cout<<endl;
}
完整代码:
#include<iostream>
using namespace std;
typedef struct PNode
{
float coef;
int expn;
struct PNode *next;
}PNode,*Polynomial;
void CreatePolyn(Polynomial &P,int n)
{
int i;
Polynomial s,pre,q;
P=new PNode;
P->next=NULL;
for(i=1;i<=n;++i)
{
s=new PNode;
cin>>s->coef>>s->expn;
pre=P;
q=P->next;
while(q&&q->expn<s->expn)
{
pre=q;
q=q->next;
}
s->next=q;
pre->next=s;
}
}
void AddPolyn(Polynomial &L,Polynomial L1,Polynomial L2)
{
Polynomial p1,p2,p,q;
p=L=L1;
p1=L1->next;
p2=L2->next;
while(p1&&p2)
{
if(p1->expn==p2->expn)
{
int sum=p1->coef+p2->coef;
if(sum!=0)
{
p1->coef=sum;
p->next=p1;
p=p1;
p1=p1->next;
q=p2;
p2=p2->next;
delete q;
}
else
{
q=p1;
p1=p1->next;
delete q;
q=p2;
p2=p2->next;
delete q;
}
}
else if(p1->expn<p2->expn)
{
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
p->next=p1?p1:p2;
}
void output(Polynomial L)
{
Polynomial p=L->next;
while(p)
{
cout<<p->coef<<"x^"<<p->expn;
if(p->next)
cout<<"+";
p=p->next;
}
cout<<endl;
}
int main()
{
Polynomial L1,L2,L;
int n;
cin>>n;
CreatePolyn(L1,n);
cin>>n;
CreatePolyn(L2,n);
AddPolyn(L,L1,L2);
output(L);
}