求两个一元多项式的和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分1行,分别以指数递降方式输出和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例1:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例1:
5 20 -4 4 -5 2 9 1 -2 0
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int xishu;
int zhishu;
struct node *next;
} node,*plnode;
void add(plnode &Pa,plnode &Pb);
void create(plnode &P,int n);
void show(plnode &P);
int main()
{
plnode LA,LB;
int m,n;
scanf("%d",&n);
create(LA,n);
scanf("%d",&m);
create(LB,m);
add(LA,LB);
show(LA);
return 0;
}
void create(plnode &P,int n)
{
P=new node;
P->next=NULL;
for(int i=1; i<=n; i++)
{
plnode s=new node;
scanf("%d %d",&s->xishu,&s->zhishu);
plnode pre=P;
plnode q=P->next;
while(q&&q->zhishu > s->zhishu)
{
pre=q;
q=q->next;
}
s->next=q;
pre->next=s;
}
}
void show(plnode &P)
{
int flag=0;
P=P->next;
if(!P)
{
printf("0 0\n");
return;
}
while(P)
{
if(flag)
{
printf(" ");
}
flag=1;
printf("%d ",P->xishu);
printf("%d",P->zhishu);
P=P->next;
}
printf("\n");
}
void add(plnode &Pa,plnode &Pb)
{
plnode p1,p2,p3,r;
p1=Pa->next;
p2=Pb->next;
p3=Pa;
while(p1&&p2)
{
if(p1->zhishu == p2->zhishu)
{
int sum=p1->xishu+p2->xishu;
if(sum!=0)
{
p1->xishu=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->zhishu > p2->zhishu)
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
}
p3->next = p1 ? p1 : p2;
delete Pb;
}