伪码描述过于抽象,于是决定自己动手按照逻辑实现一次。看到AC的时候实在是太过激动,于是决定另开一篇文章分享一下实现源码。
代码写的及其的不美观,要是能再精简一下就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
using namespace std;
typedef struct PNode{
float coef; //系数
int expn; //指数
struct PNode* next; //指针域
}PNode,*Polynomal;
void MergeList_L(Polynomal LA,Polynomal LB,Polynomal &LC){
PNode* p = LA -> next;PNode* q = LB -> next; //p,q指针指向LA,LB两表首元素
PNode* r = LC; //r指向LC表
while(p != NULL && q != NULL){ //循环条件为LA,LB两表均未到达表尾
if(p -> expn == q -> expn){ //第一层if:p,q指数相等情况
if(p -> coef + q -> coef == 0){ //第二层if:判断p,q系数是否相加为零
p = p -> next;
q = q -> next; //系数和为零,向后移动p,q指针,两结点均不加入LC表
continue;
}
else{ //第二层if:p,q系数相加不为零
PNode* s = (PNode*)malloc(sizeof(PNode));
s -> next = NULL; //初始化一个s结点以便插入LC表
s -> coef = p -> coef + q -> coef;
s -> expn = p -> expn; //新结点指数为p(或q)指数,系数为p,q系数之和
r -> next = s; //将s结点插入LC表
r = r -> next;
p = p -> next;
q = q -> next; //向后移动p,q,r指针
}
}
else if(p -> expn < q -> expn){ //第一层if:p指数小于q指数
r -> next = p;
p = p -> next;
r = r -> next; //将p所指向结点作为r的下一个结点
}
else{ //第一层if:p指数大于q指数
r -> next = q;
q = q -> next;
r = r -> next; //将q所指向结点作为r的下一个结点
}
}
r -> next = p ? p : q;
}
int main()
{
int m , n;
cin >> m; cin >> n;
Polynomal LA = (PNode*)malloc(sizeof(PNode));
Polynomal LB = (PNode*)malloc(sizeof(PNode));
Polynomal LC = (PNode*)malloc(sizeof(PNode));
LA -> expn = 0;LA -> coef = 0;
LB -> expn = 0;LB -> coef = 0;
LC -> expn = 0;LC -> coef = 0;
LA -> next = NULL;LB -> next = NULL;LC -> next = NULL; //新建三个链表LA,LB,LC,并初始化
PNode* p = LA;
PNode* q = LB; //p,q结点分别表示访问到的位置
int i;
for(i = 0;i< m;i++){
int t1;
int t2;
cin >> t1;
cin >> t2; //读入新结点指数,系数值
Polynomal t = (PNode*)malloc(sizeof(PNode));
t -> next = NULL;
t -> expn = t1;
t -> coef = t2; //新建结点以便于插入LA表
p -> next = t; //将新结点插入LA表
p = p -> next; //向后移动p指针位置
}
for(i = 0;i< n;i++){
int t1;
int t2;
cin >> t1;
cin >> t2;
Polynomal t = (PNode*)malloc(sizeof(PNode));
t -> next = NULL;
t -> expn = t1;
t -> coef = t2;
q -> next = t;
q = q -> next; //同上
}
MergeList_L(LA,LB,LC); //调用多项式相加函数
PNode* r = LC -> next; //r结点指向LC表首元结点
while (r != NULL)
{
printf("%d %.0f\n",r -> expn,r -> coef);
r = r -> next;
} //遍历LC

}

测试用例

1
3 6 0 1 1 2 3 5 0 -1 1 3 2 6 3 7 4 8 5 9

答案

1
2
3
4
5
1 5
2 6
3 12
4 8
5 9

AC胜利结算