#include<iostream>
#include<string>
#include<fstream>
using namespace std;
#define ERROR 0
typedef struct PNODE
{
float coef;//系数
int expn;//指数
struct PNODE *next;//指针域
}PNODE,*POLYNOMIAL;
void CreatPolyn(POLYNOMIAL &P, int m); //多项式的创建
void AddPolyn(POLYNOMIAL &PA, POLYNOMIAL &PB);//多项式相加
int main()
{
POLYNOMIAL Pa,Pb;
POLYNOMIAL p;
int i,m,n;
cin>>m;
//创建多项式Pa
CreatPolyn(Pa, m); //调用函数,输入Pa每一项的系数和指数
cin>>n;
//创建多项式Pb
CreatPolyn(Pb, n); //调用函数,输入Pa每一项的系数和指数
AddPolyn(Pa,Pb);
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;
}
void CreatPolyn(POLYNOMIAL &P, int m)
{
P=new PNODE;
P->next=NULL;
POLYNOMIAL e,pre,q;
for(int i=1;i<=m;i++)
{
e=new PNODE;
cin>>e->coef>>e->expn;
pre=P;
q=P->next;
while(q&&q->expn<e->expn)
{
pre=q;
q=q->next;
}
e->next=q;
pre->next=e;
}
}
void AddPolyn(POLYNOMIAL &PA, POLYNOMIAL &PB)//多项式相加
{
POLYNOMIAL p1,p2,p3,r;
p1=PA->next;
p2=PB->next;
p3=PA;
int sum=0;
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;
}
类似于简单的两个链表合并,但是在多项式中需要开辟两个数据域:指数,系数;
总共分三种情况:
1.第一个多项式的指数与第二个多项式的指数相同,直接相加求和;如果和为零的话,指向下一个节点,并且删除此链表中的两个节点。
2.第一个多项式的指数<第二个多项式的指数,直接将p1链入。
3..第一个多项式的指数>第二个多项式的指数,直接将p2链入。
最后再将没有遍历完的链表直接接到p3上即可。