#include<iostream>
using namespace std;
typedef struct PNode{
float coef;//系数
int expn;//指数
struct PNode *next;//指针域
}PNode,*Polynomial;
void CreatePolyn(Polynomial &P,int n);
void AddPolyn (Polynomial &Pa , Polynomial &Pb);
int main(){
PNode *Pa,*Pb;
PNode *p3;
int x,y;
cout<<"请输入Pa表的项数:";
cin>>x;
CreatePolyn(Pa,x);
cout<<"请输入Pb表的项数:";
cin>>y;
CreatePolyn(Pb,y);
cout<<"联合表为:";
AddPolyn(Pa,Pb);
p3=Pa->next;
while(p3){
cout<<"p3->coef"<<p3->coef;
cout<<"p3->expn"<<p3->expn;
p3=p3->next;
}
}
void CreatePolyn(Polynomial &P,int n){//输入n项的系数和指数,建立表示多项式的有序链表P
P=new PNode;//先建立一个带头结点的单链表
P->next=NULL;//依次输入n个非零项
for(int i=1;i<=n;++i){
PNode *s=new PNode;//生成新结点
cin>>s->coef>>s->expn;//输入系数和指数
PNode *pre=P;//pre用于保存q的前驱,初值为头结点
PNode *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){
//多项式加法: Pa = Pa + Pb ,利用两个多项式的结点构成"和多项式"
PNode *pl,*p2;PNode *p3;
pl = Pa -> next;p2= Pb ->next;//p1和p2初值分别指向 Pa 和 Pb 的首元结点
p3=Pa ;//p3指向和多项式的当前结点,初值为 Pa
while (pl&&p2){//p1和p2均非空
if (pl-> expn ==p2-> expn ){//指数相等
int sum =pl-> coef +p2-> coef; // sum 保存两项的系数和
if ( sum !=0){//系数和不为0
pl -> coef = sum ;//修改 Pa 当前结点的系数值为两项系数的和
p3-> next =pl;p3=pl;//将修改后的 Pa 当前结点链在p3之后,p3指向p1
pl=pl->next;//p1指向后一项
PNode *r =p2;p2=p2-> next; delete r;//删除 Pb 当前结点,p2指向后一项
}
else
{
PNode *r= pl; pl=pl->next; delete r ;//删除 Pa 当前结点,p1指向后一项
r =p2;p2=p2-> next ; delete r;//删除Pb当前节点,P2指向后一项
}
}
else if (pl-> expn <p2-> expn ){// Pa 当前结点的指数值小
p3-> next =pl;//将p1链在p3之后
p3=pl;//p3指向p1
pl = pl -> next ;
}//p1指向后一项
else{ // Pb 当前结点的指数值小
p3-> next =p2;//将p2链在p3之后
p3=p2;//p3指向p2
p2=p2->next;//p2指向后一项
}
}// while
p3->next=pl?pl:p2;//插入非空多项式的剩余段
delete Pb;//释放 Pb 的头结点
}