
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
//這里看不明白的話可以看看c語言中typedef的用法:https://blog.csdn.net/theonegis/article/details/40049667
typedef struct PNode
{
int coef; //系數
int expn; //指數
struct PNode *next;
}PNode, *Polynomial;
void Attach(int c, int e, Polynomial *Rear) //將新節點插入到鏈表的尾部
{
Polynomial P = (Polynomial)malloc(sizeof(PNode));
P->coef = c;
P->expn = e;
P->next = NULL;
(*Rear)->next = P;
*Rear = P;
}
Polynomial Read()
{
Polynomial L = (Polynomial)malloc(sizeof(PNode));
L->next = NULL;
int n;
scanf("%d", &n);
Polynomial rear = L;
while(n--)
{
int a, b;
scanf("%d %d", &a, &b);
Attach(a, b, &rear);
}
Polynomial t = L;
L = L->next;
free(t); //刪除臨時生成的頭節點
return L;
}
Polynomial Add(Polynomial P1, Polynomial P2) //兩個多項式的加法
{
Polynomial t1 = P1, t2 = P2;
Polynomial P = (Polynomial)malloc(sizeof(PNode)); //注意malloc出的內存只能用free刪除,不能用別的
P->next = NULL;
Polynomial rear = P;
while(t1 && t2)
{
if(t1->expn == t2->expn)
{
int sum = t1->coef + t2->coef;
int expn = t1->expn;
if(sum) //若和不為0,直接將它插入到新鏈表的末端
Attach(sum, expn, &rear);
t1 = t1->next;
t2 = t2->next;
}
else if(t1->expn < t2->expn) //若指數不相等,則插入指數較大的
{
int coef = t2->coef, expn = t2->expn;
Attach(coef, expn, &rear);
t2 = t2->next;
}
else if(t1->expn > t2->expn)
{
int coef = t1->coef, expn = t1->expn;
Attach(coef, expn, &rear);
t1 = t1->next;
}
}
while(t1) //若有剩余的,依次插入即可
{
Attach(t1->coef, t1->expn, &rear);
t1 = t1->next;
}
while(t2)
{
Attach(t2->coef, t2->expn, &rear);
t2 = t2->next;
}
t2 = P;
P = P->next;
free(t2); //釋放頭節點
return P;
}
Polynomial Mul(Polynomial p1, Polynomial p2)
{
if(!p1 || !p2) return NULL;
Polynomial t1 = p1, t2 = p2;
Polynomial P = (Polynomial)malloc(sizeof(PNode));
P->next = NULL;
Polynomial rear = P;
while(t2) //先用p1的第一項乘以p2的每一項,得到P
{
Attach(t1->coef * t2->coef, t1->expn + t2->expn, &rear);
t2 = t2->next;
}
t1 = t1->next; //得到p1的下一項,根據前面得到的P,對兩個多項式逐項相乘(前面算過的就不用再算了),將它們插入到合適的位置
while(t1)
{
t2 = p2, rear = P; //另一個多項式從初始位置開始
while(t2)
{
int e = t1->expn + t2->expn, c = t1->coef * t2->coef; //兩項的*運算
while(rear->next && rear->next->expn > e) //找到下一項的指數小於或等於e的
rear = rear->next;
if(rear->next && rear->next->expn == e) //如果找到指數相同的
{
if(rear->next->coef + c != 0) //系數不為0則加起來
rear->next->coef += c;
else //系數為零了就把這個系數為零的項刪除
{
Polynomial t = rear->next;
rear->next = t->next;
free(t);
}
}
else //小於e,則把新項插入到它之后,沒理解就慢慢想,畫圖
{
Polynomial t = (Polynomial)malloc(sizeof(PNode));
t->coef = c;
t->expn = e;
t->next = rear->next;
rear->next = t;
rear = rear->next;
}
t2 = t2->next; //下一項
}
t1 = t1->next; //下一項
}
t2 = P;
P = P->next;
free(t2);
return P;
}
void Print(Polynomial P)
{
int flag = 0;
if(!P)
{
printf("0 0\n");
return ;
}
while(P)
{
if(!flag)
flag = 1;
else
printf(" ");
printf("%d %d", P->coef, P->expn);
P = P->next;
}
printf("\n");
}
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
Polynomial L1, L2;
L1 = Read();
L2 = Read();
Polynomial sum = Add(L1, L2);
Polynomial mul = Mul(L1, L2);
Print(mul);
Print(sum);
}