通过单链表的形式,实现多项式的加法。
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct PNode
{
float coef; //系数
int expn; //指针
struct PNode *next; //指针域
}PNode,*Polynomial;
void CreatePolyn(Polynomial &P,int n)
{
Polynomial s,pre,q;
P=new PNode;
P->next=NULL; //建立一个带头结点的单链表
for(int i=1;i<=n;++i) //依次输入n个非零项
{
s=new PNode; //生成新结点
cin>>s->coef>>s->expn; //输入系数和指数
pre=P; //用以保存q的前驱,初值为头结点
q=P->next; //q初始化,指向首元结点
while(q&&q->expn<s->expn) //比较指数找到第一个大于输入项指数的项*q
{
pre=q;
q=q->next;
}
s->next=q; //将输入项s插入到q和其前驱结点pre之间
pre->next=s;
}
}
void AddPolyn(Polynomial &Pa,Polynomial &Pb)
{
Polynomial p1,p2,p3,r;
float sum;
p1=Pa->next; //p1和p2初值分别指向Pa和Pb的首元结点
p2=Pb->next; //p3指向和多项式的当前结点,初值为Pa
p3=Pa; //p1和p2均非空
while(p1&&p2)
{
if(p1->expn==p2->expn) //指数相等
{
sum=p1->coef+p2->coef; //sum保存两项的系数和
if(sum!=0) //系数和不为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) //Pa当前结点的指数小
{
p2->next=p1;
p3=p1;
p1=p1->next;
}
else //Pb当前的指数小
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
}
p3->next=p1?p1:p2; //插入非空多项式的剩余段
delete Pb; //释放Pb的头结点
}
int prin(Polynomial &h) //输出多项式
{
Polynomial p=h->next;
while(p)
{
cout<<p->coef<<"x^"<<p->expn;
if(p->next)
cout<<"+"; //控制输入“+”的条件
p=p->next;
}
return 0;
}
int main()
{
PNode *Pa,*Pb;
CreatePolyn(Pa,3); //创建多项式
prin(Pa);
cout<<endl;
CreatePolyn(Pb,2);
prin(Pb);
cout<<endl;
AddPolyn(Pa,Pb); //多项式相加
prin(Pa); //输出
cout<<endl;
return 0;
}
运行结果如下: