问题描述 :
假设2个稀疏一元多项式分别由带头结点的有序单链表A和B存储(指数项递增有序)。现要求设计一个算法,实现稀疏一元多项式的加减法计算。要求使用A和B的原存储空间(运算后B不再存在,A链表中保存结果多项式)。输入中的单链表的长度不得在计算算法中利用,仅作为建表使用。
注意:加/减法计算后,如某一项的结果系数为0,则该项要从多项式链表中删除。
输入说明 :
第一行:加/减法选择(0:加法 1:减法)
第二行:一元多项式A的项数
第三行:一元多项式A的各项的系数(系数之间以空格分隔)
第四行:一元多项式A的各项的指数(指数之间以空格分隔)
第五行:一元多项式B的项数
第六行:一元多项式B的各项的系数(系数之间以空格分隔)
第七行:一元多项式B的各项的指数(指数之间以空格分隔)
如果A或B的项数为0,则认为输入的多项式只包含数字“0”,即系数为0,指数也为0。
输出说明 :
第一行:多项式A的第一项的系数、指数(以空格分隔)
第一行:多项式A的第二项的系数、指数(以空格分隔)
...
第n行:多项式A的第n项的系数、指数(以空格分隔) (假设多项式A的项数为n)
(空行)
第一行:多项式B的第一项的系数、指数(以空格分隔)
第一行:多项式B的第二项的系数、指数(以空格分隔)
...
第m行:多项式B的第m项的系数、指数(以空格分隔) (假设多项式B的项数为m)
(空行)
第一行:加/减法计算后,结果多项式A的第一项的系数、指数(以空格分隔)
第一行:加/减法计算后,结果多项式A的第二项的系数、指数(以空格分隔)
...
第p行:加/减法计算后,结果多项式A的第n项的系数、指数(以空格分隔) (假设结果多项式的项数为p)
(多项式之间以空行分隔,如果多项式只包含“0”,则相应的多项式输出"0 0",不包含引号。)
输入范例 :
1
6
7 3 -22 9 5 -8
0 1 7 8 17 100
3
8 22 -9
1 7 8
输出范例 :
7 0
3 1
-22 7
9 8
5 17
-8 100
8 1
22 7
-9 8
7 0
-5 1
-44 7
18 8
5 17
-8 100
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #include <iostream> #include <vector> using namespace std; typedef struct node { int factor;//系数 int index;//指数 struct node* next; node(int fa) :factor(fa),next(0){} }Node; void my_print(Node* head) { Node* p = head->next; if(!p)printf("%d %d ",0, 0); while (p) { printf("%d %d ", p->factor, p->index); p = p->next; } } //创建带头节点的链表 Node* createList(int n) { int i,val; vector<Node*> node_vec; Node* head = new Node(0); node_vec.push_back(head);//头结点 for (i = 0; i < n; i++) { scanf("%d", &val); node_vec.push_back(new Node(val)); } for (i = 1; i <= n; i++) { node_vec[i - 1]->next = node_vec[i]; scanf("%d", &val); node_vec[i]->index = val; } return head; } Node* my_fun(Node* la, Node* lb, int mode) { Node* pa=la->next, * pb=lb->next,* res=la,*res_tail=la; int temp; while (pa && pb) { if (pa->index == pb->index) { if (!mode)//+ temp = pa->factor + pb->factor; else//- temp = pa->factor - pb->factor; if (temp) { res_tail->next = pa; pa->factor = temp; res_tail = pa; } pa = pa->next; pb = pb->next; } else if (pa->index < pb->index) { res_tail->next = pa; res_tail = pa; pa = pa->next; } else { res_tail->next = pb; res_tail = pb; if (mode)pb->factor = -pb->factor; pb = pb->next; } } res_tail->next = NULL; if (pa) res_tail->next = pa; while (pb) { res_tail->next = pb; res_tail = pb; if (mode)pb->factor = -pb->factor; pb = pb->next; } return res; } int main() { int mode;//0 加 1减 scanf("%d", &mode); int n, i; scanf("%d", &n); Node* la = createList(n); scanf("%d", &n); Node* lb = createList(n); my_print(la); cout << endl; my_print(lb); cout << endl; Node* res = my_fun(la, lb, mode); my_print(res); return 0; }