设计程序求两个一元多项式的和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数。数字间以空格分隔。
输出格式:
输出1行,以指数递降方式输出和多项式非零项的系数和指数(保证不超过整数的表示范围)。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
5 20 -4 4 -5 2 9 1 -2 0
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int coef; //系数
int exp; //指数
struct node *next;
}Node,*List;
List add(List head,int coef,int exp)
{
List p=(List)malloc(sizeof(Node));
p->coef=coef;
p->exp=exp;
p->next=NULL;
head->next=p;
return p;
}
List creat()
{
int n,coef,exp;
scanf("%d",&n);
List L=(List)malloc(sizeof(Node));
L->next=NULL;
List head=L;
for(int i=0;i<n;i++)
{
scanf("%d %d",&coef,&exp);
head=add(head,coef,exp);
}
return L->next;
}
List plus(List L1,List L2)
{
List L=(List)malloc(sizeof(Node));
L->next=NULL;
List head=L;
while(L1&&L2)
{
if(L1->exp>L2->exp)
{
L->next=L1;
L=L->next;
L1=L1->next;
}
else if(L1->exp<L2->exp)
{
L->next=L2;
L=L->next;
L2=L2->next;
}
else{
if(L1->coef+L2->coef)
{
L1->coef=L1->coef+L2->coef;
L->next=L1;
L=L->next;
}
L1=L1->next;
L2=L2->next;
}
}
L->next = L1 ? L1 : L2;
return head->next;
}
void print(List L)
{
if(L==NULL) printf("0 0");
while(L)
{
if(L->next==NULL||L->next->coef==0)
{
printf("%d %d",L->coef,L->exp);
break;
}
else printf("%d %d ",L->coef,L->exp);
L=L->next;
}
}
int main(void)
{
List L1=creat();
List L2=creat();
List L=plus(L1,L2);
print(L);
return 0;
}
其中最容易出错的是print这一部分,比如一下的错误
这一步错误很明显是将题目 “零多项式应输出0 0。”这一要求忽略了
但这些都不是最大的问题,细心的同学会对 L->next = L1 ? L1 : L2; 这一步比较好奇,这是一个三元运算符,网上有的人简单地将其解释为
但很明显是错的,感兴趣的同学可以用一下以下测试案例调试一下
2 1 2 1 0
2 1 2 -1 0
会发现结果是错的,为什么?因为最后加和虽然我们没有主动添,但是L的后的一部分会自动地接上,而这个正确的解释是
- 代码中的条件语句是一个三元运算符,用于判断L1是否为空。如果L1不为空,则将L1赋值给L的next属性,即L的next指向L1;如果L1为空,则将L2赋值给L的next属性,即L的next指向L2。