#include <stdio.h>
#include <stdlib.h>
struct Node{
int coef;//系数
int expon;//指数
struct Node* next;
};
void DestroyPoly(struct Node* Poly)//释放实现多项式申请的空间
{
struct Node* Temp;
while(Poly!=NULL){
Temp=Poly;
Poly=Poly->next;
free(Temp);
}
return;
}
struct Node* CreateNode(int coe,int exp)//申请空间存放多项式当前项
{
struct Node* item;
item=(struct Node*)malloc(sizeof(struct Node));
item->coef=coe;
item->expon=exp;
item->next=NULL;
return item;
}
struct Node* CreatePoly()//创建多项式
{
int n;//项数
int coe,exp;//临时读取指数,系数
struct Node* Poly;
struct Node* Temp;
struct Node* item;
Poly=(struct Node*)malloc(sizeof(struct Node));//带有头结点的单链表
Poly->next=NULL;
scanf("%d",&n);
Temp=Poly;
for(int i=1;i<=n;i++){
scanf("%d%d",&coe,&exp);
item=CreateNode(coe,exp);
Temp->next=item;
Temp=item;
}
return Poly;
}
void PolyAdd(struct Node* Poly1,struct Node* Poly2)//计算多项式的和
{
int flag=0;//用于判断是否已经输出过项
struct Node* Temp1=Poly1->next;
struct Node* Temp2=Poly2->next;
while(Temp1&&Temp2){
if(flag)
putchar(' ');
if(Temp1->expon==Temp2->expon){
if(Temp1->coef+Temp2->coef){
printf("%d %d",Temp1->coef+Temp2->coef,Temp1->expon);
flag=1;
}
Temp1=Temp1->next;
Temp2=Temp2->next;
}
else if(Temp1->expon>Temp2->expon){
if(Temp1->coef){
printf("%d %d",Temp1->coef,Temp1->expon);
flag=1;
}
Temp1=Temp1->next;
}
else{
if(Temp2->coef){
printf("%d %d",Temp2->coef,Temp2->expon);
flag=1;
}
Temp2=Temp2->next;
}
}
while(Temp1){
if(flag)
putchar(' ');
if(Temp1->coef){
printf("%d %d",Temp1->coef,Temp1->expon);
flag=1;
}
Temp1=Temp1->next;
}
while(Temp2){
if(flag)
putchar(' ');
if(Temp2->coef){
printf("%d %d",Temp2->coef,Temp2->expon);
flag=1;
}
Temp2=Temp2->next;
}
if(!flag)//扫一遍,flag仍为0,说明多项式相加为0
printf("%d %d",0,0);
putchar('\n');
return;
}
int main()
{
int n;//测试样例个数
struct node* Poly1,*Poly2;//多项式
scanf("%d",&n);
for(int i=1;i<=n;i++){
Poly1=CreatePoly();
Poly2=CreatePoly();
PolyAdd(Poly1,Poly2);
//C语言与Java不同,C无自动回收机制,动态分配的空间使用结束后,需要程序员释放
DestroyPoly(Poly1);
DestroyPoly(Poly2);
}
return 0;
}
根据多项式的结构特点,利用线性链表来实现多项式相加,结点中存放各项的系数和指数,在默认用户按降幂次序输入多项式的各项后,构造相应的多项式。从头扫描两个多项式,用两个指针分别指示两个多项式的当前项,根据多项式相加的规则,对于指数相同的项,将其对应系数相加,若和不为零,则构成“和多项式”中的一项;对于两个多项式中指数不同的项,可直接复制到和多项式中,并按从大到小的降幂排列。若多项式相加的结果为0,输出0 0。本实验只要求输出多项式相加的和,因此只需在扫描时输出相应的项,不需要创建一个新的多项式存储结果。
测试样例: 7
4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1
2 1 2 1 0 2 1 2 -1 0
2 -1000 1000 1000 0 2 1000 1000 -1000 0
0 1 999 1000
0 0
3 1 10 -4 5 3 0 4 3 8 4 7 -3 6 4 0
1 1 0 1 3 0
结果: 5 20 -4 4 -5 2 9 1 -2 0 2 2 0 0 999 1000 0 0 1 10 3 8 4 7 -3 6 -4 5 7 0 4 0 |
分析: 输出结果时,应考虑到多项式的某一项系数为零时的情况,且代码需要实现当多项式相加为零或两个空多项式相加时的情况,即需要输出结果为0 0。 心得: 1.写代码不能只为了竞赛,最终目的还是工作,因此要考虑用户需求,代码实现的简便性等,平日的代码也要像做工程一样做好事先规划与调试,开始创建了一个新多项式存储结果再输出,没有考虑此实验需求,后来改了过来,只输出结果即可,还有,代码要功能明确,分块明显,让他人一眼看出此块代码实现什么功能,自己调试时也容易,如果堆在一块,牵一发则动全身。 2.代码要一气呵成,自上而下,忌左补右补。 |