02-线性结构2 一元多项式的乘法与加法运算 (20分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出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
#include<iostream>
using namespace std;
typedef struct PNode* List;
struct PNode{
int coef,expon;
List link;
};
List Read();
void Attach(int c,int e,List* L);
List AddP(List P1,List P2);
List Mpc(List P1,List P2);
void Print(List P);
int main(){
List P,Q,PP,PS;
P=Read();
Q=Read();
PP=Mpc(P,Q);
Print(PP);
printf("\n");
PS=AddP(P,Q);
Print(PS);
return 0;
}
List Read(){
int m,c,e;
List L,rear,temp;
L=(List)malloc(sizeof(PNode));
L->link=NULL;
rear=L;
cin>>m;
while(m--){
cin>>c>>e;
Attach(c,e,&rear);
}
temp=L;
L=L->link;
free(temp);
return L;
}
void Attach(int c,int e,List* L){
List P;
if(!(*L))return ;
P=(List)malloc(sizeof(PNode));
P->coef=c;
P->expon=e;
P->link=NULL;
(*L)->link=P;
(*L)=P;
}
List AddP(List P1,List P2){
List L,rear,temp,p,q;
p=P1;
q=P2;
if(!q&&!q)return NULL;
L=(List)malloc(sizeof(PNode));
rear=L;
L->link=NULL;
while(p&&q){
if(p->expon>q->expon){
Attach(p->coef,p->expon,&rear);
p=p->link;
}else if(p->expon<q->expon){
Attach(q->coef,q->expon,&rear);
q=q->link;
}else{
if(p->coef+q->coef){
Attach(p->coef+q->coef,q->expon,&rear);
}
p=p->link;
q=q->link;
}
}
if(p){
rear->link=p;
}
if(q){
rear->link=q;
}
if(L->link){
temp=L;
L=L->link;
free(temp);
return L;
}else{
return NULL;
}
}
List Mpc(List P1,List P2){
int c,e;
List L,rear,temp,p,q;
p=P1;
q=P2;
if(!p||!q)return NULL;
L=(List)malloc(sizeof(PNode));
rear=L;
L->link=NULL;
while(q){
Attach(q->coef*p->coef,q->expon+p->expon,&rear);
q=q->link;
}
p=p->link;
while(p){
q=P2;rear=L;
while(q){
c=p->coef*q->coef;
e=p->expon+q->expon;
while(rear->link&&rear->link->expon>e)
rear=rear->link;
if(rear->link&&rear->link->expon==e){
if(rear->link->coef+c){
rear->link->coef+=c;
}else{
temp=rear->link;
rear->link=temp->link;
free(temp);
}
}else{
temp=(List)malloc(sizeof(PNode));
temp->coef=c;
temp->expon=e;
temp->link=rear->link;
rear->link=temp;
rear=temp;
}
q=q->link;
}
p=p->link;
}
temp=L;
L=L->link;
free(temp);
return L;
}
void Print(List P){
List q=P;
if(!q){
printf("0 0");
return ;
}
int flag=0;
while(q){
if(flag){
printf(" ");
}else{
flag=1;
}
printf("%d %d",q->coef,q->expon);
q=q->link;
}
}