首页 > 其他分享 >多项式求和【链表】

多项式求和【链表】

时间:2024-10-24 17:45:39浏览次数:1  
标签:head head2 head1 求和 多项式 next 链表 exponent

题面

给定两个多项式,用链表表示,实现多项式的加法运算。链表中的每个节点包含两个属性:系数和指数。例如,多项式
\(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;
}

标签:head,head2,head1,求和,多项式,next,链表,exponent
From: https://www.cnblogs.com/wzzorz/p/18500032

相关文章

  • 数据结构与算法——双链表的实现
    上次学习了单链表,这次来学习双链表。二者之间的区别是,单链表中的每个结点只存有后继结点的地址,而双链表中则存了两个地址,一个是前驱结点的地址,一个是后继结点的地址。结构体structListNode{ intelement;//数据域 structListNode*next; ......
  • 单向循环链表的实现及相关算法
    1.单向循环链表特点:每一个节点除了数据域,还有一个next指针域指向下一个节点(存储了下一个节点的地址),末尾节点的指针域指向了头节点1.1实现过程1.1.1、构建结点structNode{ Node(intvalue=0): val(value), next(nullptr) {} intval; Node*next;};1......
  • 多项式全家桶(完善中)
    namespacePolynomial{constintN=2e6+5,G=3,iG=332748118;intcir[N],w[N],r[N],sav[N];voidfft(int*f,intlen,intt){for(inti=0;i<len;++i){cir[i]=(cir[i>>1]>>1)|((i&1)?len>>1:0);if(......
  • [数据结构] 删除单链表中最小值结点(C语言版本)
    如果对单链表基本操作或概念不理解的可以跳转:单链表的基本操作(C语言版)-CSDN博客https://blog.csdn.net/m0_74181956/article/details/143082621?spm=1001.2014.3001.5501算法思想:如图所示:定义指针p为L的第一个结点,pre为L的头结点,min为记录每次遍历的最小值结点,minpre为记......
  • 【数据结构与算法】之链表经典算法大集合
    本文主要内容是几个关于链表的初级经典算法的分享,都采用Java语言实现,话不多说,立马开始!注意:以下代码有关链表的算法实现均基于以下链表节点类://链表节点类publicclassListNode{intval;ListNodenext;ListNode(){}ListNode(intval){this.val=v......
  • 代码随想录-环形链表II
    题目与解析    题目链接:环形链表II本题两个关键点,1、确定有环2、确定环的入口位置 提供两种解法,第一种是我借助了一个辅助的列表来记录指针,空间复杂度O(n)比较无脑 第二种是Carl哥的双指针法,又是套圈问题,虽然很难想,但还是推荐这种方式,这才是算法解法一:publ......
  • 代码随想录-链表相交
    题解与说明要注意区分链表相交是指针相等,而不是值相等。这里当时没有想清楚,还以为leetcode的样例一给错了,原来人家是想强调这个问题哈哈这里给出三种解法:(leetcode格式)①看了代码随想录的解释后,自己写的代码。②看了代码随想录的代码后,对原有的代码循环进行优化。③......
  • 单链表的学习和总结
    单链表的学习和总结1.1 反转链表1.1.1 记录leetcode的题目206.反转链表92.反转链表II25.K个一组翻转链表1.1.2整理总结1.记录链表翻转的几种方法:目前我认为“头插法”更好理解https://leetcode.cn/problems/reverse-linked-list/solutions/2948411/dan-lian-......
  • 刚刚学了链表感觉好难(||^||)
    理念听得差不多明白了,但实现起来感觉好难,老师在上面写代码的时候一蹴而就,我自己尝试的时候一窍不通,下课花了好久才写出差不多的代码,大家有什么好方法吗?球球了(>_<)附上了写的链表代码,也欢迎大家提改进建议#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdli......
  • 【快慢指针】LeetCode 143. 重排链表
    题解用快慢指针先找到中间结点,然后断开前后两条链,用头插法的思路逆转后面那条链,最后两条链依次从前往后遍历插入即可。参考代码/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nul......