#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include <stdbool.h>
typedef struct Node *PtrToNode;
struct Node {
int a,n; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
List creat_List();
void pirnt_List(List L);
List Mult(L1,L2);
List Add(L1,L2);
int main(){
List L=NULL;
List L1=creat_List(L1);
List L2=creat_List(L2);
print_List(Mult(L1,L2));
print_List(Add(L1,L2));
return 0;
}
List creat_List(List L){
int N,an,exp;
scanf("%d",&N);
List s=NULL,temp;
L=(List)malloc(sizeof(List));
temp=L;
for(int i=0;i<N;i++){
scanf("%d%d",&an,&exp);
if(an!=0){
s=(List)malloc(sizeof(List));
s->a=an;s->n=exp;
L->Next=s;
L=s;
}
}L->Next=NULL;
return temp;
}
void print_List(List L){
if(L->Next!=NULL){
L=L->Next;
while(L){
if(L->Next)printf("%d %d ",L->a,L->n);
else printf("%d %d",L->a,L->n);
L=L->Next;
}
}else printf("%d %d",0,0);
printf("\n");
}
List Add(List L1,List L2){
List L,temp = NULL,s = NULL;
L=(List)malloc(sizeof(List));
temp = L;
while(L1->Next&&L2->Next){
if(L1->Next->n>L2->Next->n){
s = (struct Node *)malloc(sizeof(struct Node));
s->a = L1->Next->a;
s->n = L1->Next->n;
L->Next = s;
L = s;
L1 = L1->Next;
}
else if(L1->Next->n<L2->Next->n){
s = (struct Node *)malloc(sizeof(struct Node));
s->a = L2->Next->a;
s->n = L2->Next->n;
L->Next = s;
L = s;
L2 = L2->Next;
}
else{
if(L2->Next->a+L1->Next->a!=0){
s = (struct Node *)malloc(sizeof(struct Node));
s->a = L2->Next->a+L1->Next->a;
s->n = L2->Next->n;
L->Next = s;
L = s;
}
L1 = L1->Next;
L2 = L2->Next;
}
}
if(L1->Next)
L->Next = L1->Next;
else
L->Next = L2->Next;
return temp;
}
List Mult(List L1,List L2){
List L,temp=NULL,s=NULL;
L=(List)malloc(sizeof(List));
temp=L;
List La=L1;
while(La->Next){
s=(List)malloc(sizeof(List));
s->a=La->Next->a*L2->Next->a;
s->n=La->Next->n+L2->Next->n;
L->Next=s;
L=s;
La=La->Next;
}
L->Next=NULL;
L=temp;
List Lb = L2->Next;
bool flag = true;
while(Lb&&Lb->Next){
La = L1;
while(La->Next){
s = (struct Node *)malloc(sizeof(struct Node));
s->a = La->Next->a*Lb->Next->a;
s->n = La->Next->n+Lb->Next->n;
while(L->Next){
if(s->n > L->Next->n){
List val = L->Next;
L->Next = s;
s->Next = val;
flag = false;
break;
}else if(s->n== L->Next->n){
if(s->a+ L->Next->a==0){
List val = L->Next->Next;
L->Next = val;
}else
L->Next->a+=s->a;
flag=false;
break;
}L = L->Next;
}if(flag){
L->Next = s;
s->Next = NULL;
}L = temp;
La = La->Next;
flag = true;
}Lb = Lb->Next;
}return temp;
}
小白勿喷