多项式求和【链表】

题面

给定两个多项式,用链表表示,实现多项式的加法运算。链表中的每个节点包含两个属性:系数和指数。例如,多项式
\(3x^3+4x^2+5x+6\)可表示为链表 [(3,3), (4,2), (5,1), (6,0)]。

输入格式:

第一行:第一个多项式的项数n
接下来的n行:每行两个整数,分别代表系数和指数,描述第一个多项式的每一项
下一行:第二个多项式的项数m
接下来的m行:每行两个整数,分别代表系数和指数,描述第二个多项式的每一项
输出格式:

输出相加后的多项式的每一项,按指数降序排列,每一项输出系数和指数,两者之间用空格隔开。若整个多项式相加结果为0,需要输出“0 0”,除此情况外,不允许输出系数为0的项。

代码

#include <iostream>
using namespace std;
// 定义链表节点的模板类
template<typename T>
class ListNode {
public:
    T coefficient,exponent;      // 节点存储的数据
    ListNode* next; // 指向下一个节点的指针

    // 构造函数
    ListNode(T co,T ex) : coefficient(co),exponent(ex),next(nullptr) {}
};

// 定义链表的模板类
template<typename T>
class LinkedList {
public:
    ListNode<T>* head; // 链表的头指针

    // 构造函数
    LinkedList() : head(nullptr) {}

    // 析构函数
    ~LinkedList() {
        while (head != nullptr) {
            ListNode<T>* temp = head;
            head = head->next;
            delete temp;
        }
    }

    // 在链表末尾添加元素
    void append(T co,T ex) {
        ListNode<T>* newNode = new ListNode<T>(co,ex);
        if (head == nullptr) {
            head = newNode;
        } else {
            ListNode<T>* current = head;
            while (current->next != nullptr) {
                current = current->next;
            }
            current->next = newNode;
        }
    }
};

int main() {
    // 创建一个整数类型的链表
    LinkedList<int> List1,List2,Listsum;
    int n,m;
    cin>>n;
    for(int i=0;i<n;++i)
    {
        int cc,ee;
        cin>>cc>>ee;
        List1.append(cc,ee);
    }
    cin>>m;
    for(int i=0;i<m;++i)
    {
        int cc,ee;
        cin>>cc>>ee;
        List2.append(cc,ee);
    }
    ListNode<int> *head1=List1.head,*head2=List2.head;
    while(1)
    {
        //cout<<"head1="<<head1->coefficient<<" "<<head1->exponent<<endl;
        //cout<<"head2="<<head2->coefficient<<" "<<head2->exponent<<endl;
        if(head1==nullptr&&head2==nullptr)
        {
            break;
        }
        if(head1==nullptr)
        {
            Listsum.append(head2->coefficient,head2->exponent);
            head2=head2->next;
            continue;
        }
        if(head2==nullptr)
        {
            Listsum.append(head1->coefficient,head1->exponent);
            head1=head1->next;
            continue;
        }
        if(head1->exponent>head2->exponent)
        {
            //cout<<(bool)(head1->exponent>head2->exponent);
            Listsum.append(head1->coefficient,head1->exponent);
            head1=head1->next;
            continue;
        }
        if(head2->exponent>head1->exponent)
        {
            Listsum.append(head2->coefficient,head2->exponent);
            head2=head2->next;
            continue;
        }
        if(head2->exponent==head1->exponent)
        {
            Listsum.append(head1->coefficient+head2->coefficient,head2->exponent);
            head1=head1->next;
            head2=head2->next;
            continue;
        }
    }
    ListNode<int> *Head=Listsum.head;
    bool flag=0;
    while(Head!=nullptr)
    {
        if(Head->coefficient)
        {
            cout<<Head->coefficient<<" "<<Head->exponent<<endl;
            flag=1;
        }
        Head=Head->next;
    }
    if(!flag)
    {
        cout<<"0 0";
        return 0;
    }
    return 0;
}
posted @ 2024-10-24 17:43  G_A_TS  阅读(12)  评论(0编辑  收藏  举报