【问题描述】编写一个程序实现两个一元多项式相加的运算。
【输入形式】从标准输入中读入两行以空格分隔的整数,每一行代表一个多项式,且该多项式中各项的系数均为0或正整数,最高幂次不超过1000000。对于多项式 anxn + an-1xn-1+.... + a1x1 + a0x0 (n<=1000000)的表示方法如下: an n an-1 n-1 ... a1 1 a0 0
即相邻两个整数分别表示表达式中一项的系数和指数。在输入中只出现系数不为0的项。
【输出形式】将运算结果输出到屏幕。将系数不为0的项按指数从高到低的顺序输出,每次输出其系数和指数,均以一个空格分隔。在行的末尾也输出一个空格符,并且最后要求换行。
【样例输入】
10
54 8 2 6 7 3 25 1 78 0
6
43 7 4 2 8 1
【样例输出】
54 8 43 7 2 6 7 3 4 2 33 1 78 0
【测试代码】
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int coef; //系数
int expn; //指数
struct Node *next;
}Node;
Node* create()
{
int n,coe,exp,i;
scanf("%d",&n);
Node *head=(Node *)malloc(sizeof(Node));
head->next=NULL;
Node *p=head,*q;
for(i=0;i<n/2;i++)
{
scanf("%d%d",&coe,&exp);
q=(Node *)malloc(sizeof(Node));
q->next=NULL;
q->coef=coe;
q->expn=exp;
p->next=q;
p=q;
}
return head;
}
Node* add(Node *a,Node *b)
{
Node *p=a->next,*pre=a,*q=b->next,*u;
while(p&&q)
{
int x;
if(p->expn>q->expn)
{
pre=p;
p=p->next;
}
else if(p->expn==q->expn)
{
x=p->coef+q->coef;
if(x==0)
{
pre->next=p->next;
free(p);
p=pre->next;
u=q->next;
free(q);
q=u;
}
else
{
p->coef=x;
u=q->next;
free(q);
q=u;
}
}
else
{
u=q->next;
q->next=p;
pre->next=q;
pre=q;
q=u;
}
}
if(q)
{
pre->next=q;
}
return a;
}
void print(Node *head)
{
Node *p=head->next;
while(p)
{
printf("%d %d ",p->coef,p->expn);
p=p->next;
}
printf("\n");
}
int main()
{
Node *a,*b,*c;
a = create();
b = create();
c = add(a,b);
print(c);
return 0;
}