本篇文章记录下稀疏多项式的加法,利用链表实现两个多项式的加法。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef int Status;
#define OVERFLOW -1
#define ERROR 0
#define OK 1
typedef struct PNode
{
float coef;//系数
int expn;//指数
struct PNode *next;//指针
}PNode,*Polynomial;
int sum=0;
Polynomial Pa;
Polynomial Pb;
Status TraverseList(Polynomial L)
{
PNode *p = L->next; //p指向首元结点
if(p->expn == 0)
cout<<p->coef;
else if(p->expn == 1)
cout<<p->coef<<"x";
else
cout<<p->coef<<"x^"<<p->expn;
p = p->next;
while(p)
{
cout<<' ';
if(p->coef > 0)
cout<<"+ ";
else
{
cout<<"- ";
p->coef = abs(p->coef);
}
if(p->expn == 1)
cout<<p->coef<<"x";
else
cout<<p->coef<<"x^"<<p->expn;
p = p->next;
}
cout<<'\n';
return OK;
}
void CreatePolyn(Polynomial &P,int n)
{
P=new PNode;
P->next=NULL;
for(int i=1;i<=n;i++)
{
PNode *s=new PNode;
cin>>s->coef>>s->expn;
PNode *pre=P;
PNode *q=P->next;
while(q&&q->expn< s->expn)
{
pre=q;
q=q->next;
}
s->next=q;
pre->next=s;
}
}
void AddPolyn(Polynomial &Pa,Polynomial &Pb)
{
PNode *p1=Pa->next;
PNode *p2=Pb->next;
PNode *p3=Pa;
PNode *r;
while(p1&&p2)
{
if(p1->expn==p2->expn)
{
sum=p1->coef+p2->coef;
if(sum!=0)
{
p1->coef=sum;
p3->next=p1;
p3=p1;
p1=p1->next;
r=p2;p2=p2->next; delete r;
}
else
{
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;
}
int main()
{
int n;
cout<<"请输入多项式A的项数:";
cin>>n;
cout<<"请输入多项式A的各项的系数和指数:";
CreatePolyn(Pa, n);
cout<<"请输入多项式B的项数:";
cin>>n;
cout<<"请输入多项式B的各项的系数和指数:";
CreatePolyn(Pb, n);
cout<<'\n';
cout<<"A(x) = ";
TraverseList(Pa);
cout<<"B(x) = ";
TraverseList(Pb);
AddPolyn(Pa, Pb);
cout<<"A(x) + B(x) = ";
TraverseList(Pa);
return 0;
}
完结!