DS线性表—多项式相加 C++

温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。 

目录

题目描述

思路分析

AC代码 


题目描述

对于一元多项式p(x)=p0+p1x+p2x2+…+pnxn,每个项都有系数和指数两部分,例如p2x2的系数为p2,指数为2。

编程实现两个多项式的相加。

例如5+x+2x2+3x3,-5-x+6x2+4x4,两者相加结果:8x2+3x3+4x4

其中系数5和-5都是x的0次方的系数,相加后为0,所以不显示。x的1次方同理不显示。

要求用单链表实现。

输入

第1行:输入t表示有t组测试数据

第2行:输入n表示有第1组的第1个多项式包含n个项

第3行:输入第一项的系数和指数,以此类推输入n行

接着输入m表示第1组的第2个多项式包含m项

同理输入第2个多项式的m个项的系数和指数

参考上面输入第2组数据,以此类推输入t组

假设所有数据都是整数

输出

对于每1组数据,先用两行输出两个原来的多项式,再用一行输出运算结果,不必考虑结果全为0的情况

输出格式参考样本数据,格式要求包括:

1.如果指数或系数是负数,用小括号括起来。

2.如果系数为0,则该项不用输出。

3.如果指数不为0,则用符号^表示,例如x的3次方,表示为x^3。

4.多项式的每个项之间用符号+连接,每个+两边加1个空格隔开。

输入样例1 

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

输出样例1

5 + 1x^1 + 2x^2 + 3x^3
(-5) + (-1)x^1 + 6x^2 + 4x^4
8x^2 + 3x^3 + 4x^4
(-3) + (-5)x^1 + 2x^2
9x^(-1) + 2 + 3x^1 + (-2)x^2
9x^(-1) + (-1) + (-2)x^1

思路分析

这是一道经典的例题。

我们假设你已经会了链表的插入操作,在这基础上我们讲讲这道题。

首先必须先说的就是输入的问题,这个格式输出本身很讲究技巧,括号配负数这个不难,比较棘手的是加号什么时候输入,如果你的链表里面存了系数为0的项,这里的判断就要很讲究,你可能需要判断当系数为0的时候就直接跳过这个节点不输出,事情有没有那么简单我还不清楚,因为我后来想到了另一种解决方法,那就是在插入的时候,系数为0的项我直接不存@_@,这样我就不用考虑系数为0的情况了。

然后是相加的操作,依旧是新链表来装结果,先记录两个链表的开始节点,然后循环遍历,先找指数相同的加起来,为0的就不用存了,不为0的就插入新链表,同类项合并完之后,比较指数大小,小的先插入,直到其中有一个链表遍历完了跳出循环,再把另一个链表剩下的元素插入。

AC代码 

#include <iostream>
using namespace std;
class Node {
public:
    int factor, index;
    Node * next;
};
class List {//带头结点的单链表,位置从0到n,0是头结点,1是首结点,n是尾结点
public:
    Node * head; //头结点
    int size; //表长
    List();		//构造函数,创建头结点
    ~List();	//析构函数,逐个结点回收
    int Insert(int factor, int index, int i);	//第i位置插入元素,操作成功或失败返回OK或ERROR
    void print();				//打印单链表所有数据
    int Plus(Node *La, Node *Lb) {
        Node*pa = La, *pb = Lb;
        while (pa && pb) {
            if (pa->index == pb->index) {
                Insert(pa->factor + pb->factor, pa->index, size + 1);
                pa = pa->next;
                pb = pb->next;
            } else if (pa->index < pb->index) {
                Insert(pa->factor, pa->index, size + 1);
                pa = pa->next;
            } else {
                Insert(pb->factor, pb->index, size + 1);
                pb = pb->next;
            }
        }
        while (pa) {
            Insert(pa->factor, pa->index, size + 1);
            pa = pa->next;
        }
        while (pb) {
            Insert(pb->factor, pb->index, size + 1);
            pb = pb->next;
        }
        return 0;
    }
};
List::List(): size(0) {
    head = new Node();
}
List::~List() {
    Node *p, *q;
    p = head->next;
    while (p != NULL) {
        q = p;
        p = p->next;
        delete q;
    }
    size = 0;
    head->next = NULL;
}
int List::Insert(int factor, int index, int i) {
	if(factor==0)
	return 0;
    Node*p = head;
    int j = 1;
    while (j++ < i) {
        p = p->next;
    }
    Node*q = new Node();
    q->factor = factor;
    q->index = index;
    q->next = p->next;
    p->next = q;
    size++;
    return 0;
}
void List::print() {
    Node*p = head->next;
    for (int i = 1; i <= size; i++) {
        if (p->factor < 0)
            cout << '(' << p->factor << ')';
        else if (p->factor > 0)
            cout << p->factor;
        if (p->index < 0 && p->factor)
            cout << "x^(" << p->index << ')';
        else if (p->index > 0 && p->factor)
            cout << "x^" << p->index;
        if (i != size)
            cout << " + ";
        p = p->next;
    }
    cout << endl;
}
int main() {
    int t, n, m, factor, index;
    cin >> t;
    while (t--) {
        List a, b, c;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> factor >> index;
            a.Insert(factor, index, i);
        }
        a.print();
        cin >> m;
        for (int i = 1; i <= m; i++) {
            cin >> factor >> index;
            b.Insert(factor, index, i);
        }
        b.print();
        c.Plus(a.head->next, b.head->next);
        c.print();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_62264287/article/details/127092634
今日推荐