
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int coef;
int index;
Node* Next;
};
typedef Node* List;
List Insert(List L,int tmpc,int tmpi){
List tmp=new Node;
tmp->coef=tmpc;
tmp->index=tmpi;
tmp->Next=NULL;
List L1=L;
while(L1->Next){
L1=L1->Next;
}
L1->Next=tmp;
return L;
}
List order_Insert(List L,int tmpc,int tmpi){
//有序插入,链表排序比较复杂,不如在插入的时候就有序插入
List tmp=new Node;
tmp->coef=tmpc;
tmp->index=tmpi;
tmp->Next=NULL;
List L1=L;
while(L1->Next){
if(L1->Next->index>tmpi)L1=L1->Next;
else break;
}
tmp->Next=L1->Next;
L1->Next=tmp;
return L;
}
List CreateL(List L){
int n,tmpc,tmpi;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d %d",&tmpc,&tmpi);
L=Insert(L,tmpc,tmpi);
}
return L;
}
List add(List L3,List L1,List L2){
//注意算出系数为0则不必插入,加法一定是有序的
List L4=L1->Next;
List L5=L2->Next;
while(L4&&L5){
if(L4->index==L5->index){
if((L4->coef+L5->coef)!=0)L3=Insert(L3,L4->coef+L5->coef,L4->index);
L4=L4->Next;
L5=L5->Next;
}else if(L4->index>L5->index){
L3=Insert(L3,L4->coef,L4->index);
L4=L4->Next;
}else{
L3=Insert(L3,L5->coef,L5->index);
L5=L5->Next;
}
}
while(L4){
L3=Insert(L3,L4->coef,L4->index);
L4=L4->Next;
}
while(L5){
L3=Insert(L3,L5->coef,L5->index);
L5=L5->Next;
}
return L3;
}
List find(List L,int fi){
List L1=L->Next;
while(L1&&(L1->index!=fi)){
L1=L1->Next;
}
if(L1){
return L1;
}else{
return NULL;
}
}
List mul(List L3,List L1,List L2){
//乘法插入不一定有序,注意系数非0才插入新项
//此处未解决与原相同指数项的系数抵消的问题(需要删除原结点),所以最后输出还是得判0
List L4=L1->Next;
List L5=L2->Next;
int tmpc,tmpi;
List tmpf;
while(L4){
while(L5){
tmpc=L4->coef*L5->coef;
tmpi=L4->index+L5->index;
tmpf=find(L3,tmpi);
if(tmpf){
tmpf->coef+=tmpc;
}else{
if(tmpc!=0)L3=order_Insert(L3,tmpc,tmpi);
}
L5=L5->Next;
}
L4=L4->Next;
L5=L2->Next;
}
return L3;
}
void PrintL(List L3){
int flag=0;
L3=L3->Next;
if(!L3){
printf("0 0");
return;
}
while(L3){
if(flag){
if(L3->coef!=0)printf(" %d %d",L3->coef,L3->index);
}else{
if(L3->coef!=0)printf("%d %d",L3->coef,L3->index);
flag=1;
}
L3=L3->Next;
}
return;
}
int main(){
List L1,L2;
L1=new Node;L2=new Node;
L1->Next=NULL;L2->Next=NULL;
L1=CreateL(L1);L2=CreateL(L2);
List L3=new Node;L3->Next=NULL;
List L4=new Node;L4->Next=NULL;
L3=mul(L3,L1,L2);
L4=add(L4,L1,L2);
PrintL(L3);
printf("\n");
PrintL(L4);
return 0;
}