题目描述
一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的两个一元多项式求积,并输出求积的结果。
输入格式
输入为两个一元多项式,每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束。 系数和指数均为整数,指数不小于0。
输出格式
输出为求积结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行。 系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0。
输入样例 复制
2 5 1 0 -1 -1
5 4 3 0 -1 -1
输出样例 复制
10 9 6 5 5 4 3 0
数据范围与提示
数据范围:每个多项式的数据项数量不超过10000
分类标签
数据结构作业-线性表
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node{
int x;
int z;
struct Node *next;
}*List;
void attach(int x,int z,List *r);
List input();
List getmul(List p1,List p2);
void output(List p);
int main(){
List p1,p2,mul;
p1=input();
p2=input();
mul=getmul(p1,p2);
output(mul);
printf("\n");
}
List input(){
int x,z;
List r,p,temp;
p=(struct Node*)malloc(sizeof(struct Node));
r=p;
while(scanf("%d%d",&x,&z)!=EOF){
if(x==-1 && z==-1)break;
else{
if(x!=0) attach(x,z,&r);
}
}
temp=p;
p=p->next;
free(temp);
return p;
}
void attach(int x,int z,List *r){
List p;
p=(struct Node*)malloc(sizeof(struct Node));
p->x=x;
p->z=z;
p->next=NULL;
(*r)->next=p;
(*r)=p;
}
List getmul(List p1,List p2){
if(!p1||!p2) return NULL;
List r,p,temp,t1,t2;
int x,z;
p=(struct Node*)malloc(sizeof(struct Node));
p->next=NULL;
r=p;
t1=p1;
t2=p2;
while(t2){
attach(t1->x*t2->x,t1->z+t2->z,&r);
t2=t2->next;
}
t1=t1->next;
while(t1){
t2=p2;
r=p;
while(t2){
x=t1->x*t2->x;
z=t1->z+t2->z;
while(r->next && r->next->z>z){
r=r->next;
}
if(r->next && r->next->z==z){
if(r->next->x+x){
r->next->x+=x;
}
else{
temp=r->next;
r->next=temp->next;
free(temp);
}
}
else{
temp=(struct Node*)malloc(sizeof(struct Node));
temp->x=x;
temp->z=z;
temp->next=r->next;
r->next=temp;
}
t2=t2->next;
}
t1=t1->next;
}
temp=p;
p=p->next;
free(temp);
return p;
}
void output(List p){
int flag=0;
if(!p)
printf("0");
while(p){
if(!flag){
flag=1;
}
else{
printf(" ");
}
printf("%d %d",p->x,p->z);
p=p->next;
}
}










