输入格式:
a//每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
分别以指数递降方式输出和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
零多项式应输出0 0。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
主要思路:相同指数的项系数相加,其余项进行拷贝;
首先:
数据存储:以单向链表的形式存储
struct p{
int coef;//系数
int expon;//指数
struct p *link;//指向下一个节点的指针;
};
typedef struct p *polynomial;
polynomial p1,p2;
算法思路:
两个指针p1,p2分别指向对应链表的第一个节点;
如果 p1->expon==p2->expon 将p1,p2的->coef 相加 拷贝到结果里;
同时p1,p2都指向下一项;
if (p1->expon>p2->expon) :将p1拷贝到结果里,并使得p1指向下一项;
if(p1->expon<p2->expon):将p2的当前项存入结果多项式,并使得p2指向下一项;
当某一列节点复制完后,将另一项剩余项依次复制到结果里。
具体函数实现:
ploynomail polyadd(polynomial p1,polynomial p2)
{
polynomial front,rear,temp;
int sum;
rear=(polynomial)malloc(sizeof(struct polynode));
front=rear;
while(p1&&p2)
{
switch(compare(p1->expon,p2->expon)
{
case 1:
attach(p1->coef,p1->expon,&rear);
p1=p1->link;
break;
case -1:
attach(p2->coef,p2->expon,&rear);
p2=p2->link;
break;
case 0;
sum=p1->coef+p2->coef;
attach(sum,p1->expon,&rear);
p1=p1->link;
p2=p2->link;
break;
}
for(;p1;p1=p1->link)
attach(p1->coef,p1->expon,&rear);
for(;p2;p2=p2->link)
attach(p2->coef,p2->expon,&rear);
rear->link=null;
temp=front;
front=front->link;
free(temp);
return front;
}
void attach (int c,int e,polynomial *prear)
{
polynomial p=(polynomial)malloc(sizeof(struct polynode));
p->coef=c;
p->expon=e;
p->link=null;
(*prear)=p->link;
*prear=p;
}