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