题目描述
一条单链表可以表示一个一元多项式,每个节点包含三个域:指数、系数和后继节点(指针或引用)。
表示多项式3X4-6X2+5X-10的单链表如图所示。给定两个多项式,实现两个多项式相加算法。
输入
第一行输入包含两个整数m,n
后续为m行和n行数据
m,n分别代表两个多项式的项数
后续每一行代表多项式的项,包含a,b两个数据,表示该项的系数和指数。
输出
从较高指数到较低指数,依次输出求得的和。
每行一项,格式与输入相同,但无需输出项数,系数为0的项也不输出。
样例输入
样例输出
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| #include<bits/stdc++.h> using namespace std; typedef struct { double xs; double zs; } Term; typedef struct ploy { Term term; ploy* next; } ploy, * LinkList; void Li(LinkList& L) { L = (ploy*)malloc(sizeof(ploy)); L->term.xs = 0.0; L->term.zs = -1; L->next = NULL; } int cmp(Term a, Term b) { if (a.zs < b.zs) return 1; else if (a.zs == b.zs) return 0; else return -1; } void in(LinkList& L, Term e) { ploy* q = L; while (q->next != NULL) { if (cmp(q->next->term, e) < 0) q = q->next; else break; } if (q->next != NULL && cmp(q->next->term, e) == 0) { q->next->term.xs += e.xs; } else { ploy* node = (ploy*)malloc(sizeof(ploy)); node->term.xs = e.xs; node->term.zs = e.zs; if (q->next == NULL) node->next = NULL; else node->next = q->next; q->next = node; } } void CP(LinkList& L, int m) {
Term e; Li(L); for (int i = 1; i <= m; i++) { cin >> e.xs >> e.zs; in(L, e); } } void add(LinkList& L1, LinkList& L2) { ploy* q; for (q = L2->next; q != NULL; q = q->next) { in(L1, q->term); } free(L2); } void SubtracatPolyn(LinkList& L1, LinkList& L2) { ploy* q; for (q = L2->next; q != NULL; q = q->next) { q->term.xs = -(q->term.xs); in(L1, q->term); } free(L2); } void visitList(LinkList L) { ploy* q = L; while (q->next != NULL) { q = q->next; if (q->term.xs != 0) { cout << q->term.xs << " " << q->term.zs << endl; } } } int main() { LinkList L1, L2; int n1, n2; cin >> n1 >> n2; CP(L1, n1); CP(L2, n2); add(L1, L2); visitList(L1); return 0; }
|