#include<stdio.h>//一元稀疏多项式的计算
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct PolyNode // 结构体
{
float coef; //系数
int exp; //指数
struct PolyNode * next;
}PolyNode;
typedef PolyNode * Polynomial; // 类型声明
Polynomial CreateList(int n) //建表并输入
{
Polynomial L,p,r;
r = L = (Polynomial )malloc(sizeof(PolyNode )); //头节点是L不能移动
L->next = NULL;
float x;
int y;
while(n--) //判断输入结束的条件为( x!=0 && y!=0 )
{
scanf("%f %d",&x,&y);
p = (Polynomial )malloc(sizeof(PolyNode ));
p->coef = x;
p->exp = y;
p->next = NULL;
r->next = p;
r = p;
}
return L; // 返回输入的链表
}
Polynomial Add(Polynomial A, Polynomial B) //加法
{
Polynomial C,S;
Polynomial pa,pb,pc;
float x;
pa = A->next;
pb = B->next;
C = (Polynomial )malloc(sizeof(PolyNode )); // 申请头节点
pc = C; // 操作时使用pc指针
pc->next = NULL;
while (pa && pb)
{
if(pa->exp == pb->exp) // 指数相等时
{
x = pa->coef + pb->coef;
if (x) // 相加完的系数不为0时
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = x;
S->exp = pa->exp;
S->next = NULL;
pc->next = S;
pc = S;
}
pa = pa->next;
pb = pb->next;
}
else
if(pa->exp < pb->exp) //指数不相等且A项指数小于B项指数时
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = pa->coef;
S->exp = pa->exp;
S->next = NULL;
pc->next = S;
pc = S;
pa = pa->next;
}
else //指数不相等且A项指数大于B项指数时
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = pb->coef;
S->exp = pb->exp;
S->next = NULL;
pc->next = S;
pc = S;
pb = pb->next;
}
}
while (pa) //A链表后几项多出来时
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = pa->coef;
S->exp = pa->exp;
S->next = NULL;
pc->next = S;
pc = S;
pa = pa->next;
}
while (pb) //B链表后几项多出来时
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = pb->coef;
S->exp = pb->exp;
S->next = NULL;
pc->next = S;
pc = S;
pb = pb->next;
}
return C;
}
Polynomial Minus(Polynomial A, Polynomial B) //减法,判断条件等都同上
{
Polynomial C,S;
Polynomial pa,pb,pc;
float x;
pa = A->next;
pb = B->next;
C = (Polynomial )malloc(sizeof(PolyNode ));
pc = C;
pc->next = NULL;
while (pa && pb)
{
if(pa->exp == pb->exp)
{
x = pa->coef - pb->coef; //系数相减
// if (x)
// {
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = x;
S->exp = pa->exp;
S->next = NULL;
pc->next = S;
pc = S;
// }
pa = pa->next;
pb = pb->next;
}
else
if(pa->exp < pb->exp)
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = pa->coef;
S->exp = pa->exp;
S->next = NULL;
pc->next = S;
pc = S;
pa = pa->next;
}
else
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = -pb->coef; // Pb放上去时,需要为负
S->exp = pb->exp;
S->next = NULL;
pc->next = S;
pc = S;
pb = pb->next;
}
}
while (pa)
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = pa->coef;
S->exp = pa->exp;
S->next = NULL;
pc->next = S;
pc = S;
pa = pa->next;
}
while (pb)
{
S = (Polynomial )malloc(sizeof(PolyNode ));
S->coef = -pb->coef; // Pb放上去时,需要为负
S->exp = pb->exp;
S->next = NULL;
pc->next = S;
pc = S;
pb = pb->next;
}
return C;
}
void PrintfPolyn(Polynomial P){//输出多项式
Polynomial t;
t=P->next;
if(t==NULL)
{
cout<<"0"<<endl;
return;
}
while(t->next){
// if(t->exp!=0)
// {
// if(t->coef!=1&&t->coef!=-1)
cout<<t->coef<<"X";
// else if(t->coef==1)
// cout<<"X";
// else
// cout<<"-X";
if(t->next->coef>=0)
cout<<"^"<<t->exp<<"+";
else
cout<<"^"<<t->exp;
// }
// else
// cout<<t->coef;
t=t->next;
}
// if(t->exp!=0){
//// if(t->coef!=1&&t->coef!=-1)
// cout<<t->coef<<"X";
//// else if(t->coef==1)
//// cout<<"x";
//// else
//// cout<<"-x";
// if(t->exp!=1)
// cout<<"^"<<t->exp;
// }
// else
// cout<<t->coef;
cout << t->coef << "X^" <<t->exp;
cout<<endl;
}
int main()
{
Polynomial P1,P2;
int t;
cin >> t;
while(t--){
int n, m;
cin >> n >> m;
P1 = CreateList(n);
P2 = CreateList(m);
int T;
cin >> T;
while(T--){
int type;
cin >> type;
if(type == 1){
// 输出
PrintfPolyn(P1);
PrintfPolyn(P2);
}
else if (type == 2){
// 相加到第一个
P1 = Add(P1,P2);
}
else if (type == 3){
// 相减到第一个
P1 = Minus(P1, P2);
}
}
}
return 0;
}
/*
1
2 3
2 0 0 4
4 5 5 6 6 7
5
1
3
1
2
1
https://blog.csdn.net/chuck_0430/article/details/8184846
*/