题目网址:NSWOJ-1096-多项式相加;
1096 - 多项式相加
时间限制:1秒 内存限制:128兆
-
题目描述
-
一条单链表可以表示一个一元多项式,每个节点包含三个域:指数、系数和后继节点(指针或引用)。
表示多项式3X4-6X2+5X-10的单链表如图所示。给定两个多项式,实现两个多项式相加算法。
输入
-
第一行输入包含两个整数m,n
后续为m行和n行数据
m,n分别代表两个多项式的项数
后续每一行代表多项式的项,包含a,b两个数据,表示该项的系数和指数。
输出
-
从较高指数到较低指数,依次输出求得的和。
每行一项,格式与输入相同,但无需输出项数,系数为0的项也不输出。
样例输入
-
2 3 1 2 1 1 2 2 1 1 2 0
样例输出
-
3 2 2 1 2 0
思路:首先初始化一个空链表来表示多项式,然后逐个输入各项,通过比较,找到第一个大于该输入项指数的节点,然后将输入项插入到该节点前面,这样即可保证多项式链表的有序性;下面就是有序表的合并;
假设透支真为heada和headb的单链表分别为多项式A和B的存储结构,指针p1和p2分别指向A和B中但钱进行比较的某个节点,则注意比较两个节点中的指数项,有下列三种情况:
(1)指针p1所指节点的指数值等于指针p2所指节点的指数值,则将两个节点中的系数相加,若和不为0,则修改p1所致节点的系数值,同时删除p2所指节点;若和为0,则删除p1和p2所指节点。
(2)指针p1所致节点的指数值小于指针p2所指节点的指数值,则应摘取p1指针所致节点插入到“和多项式”链表中去;
(3)指针p1所致节点的指数值大于指针p2所指节点的指数值,则应摘取p2指针所致节点插入到“和多项式”链表中去;
最后,当一个多项式链表为空是,则将另一个非空多项式的剩余段直接连在‘和多项式’的链表后面。
#include<iostream>
#include<string.h>
#include<stack>
using namespace std;
typedef struct LNode
{
int coef,expn;
struct LNode *next;
}LNode,*LinkList;
LinkList ListInsert(int n)
{
LinkList head,p,q,pre,tail;
head=new LNode;
head->next=NULL;
tail=head;
for(int i=0;i<n;i++)
{
p=new LNode;
cin>>p->coef>>p->expn;
pre=head;
q=head->next;
while(q&&q->expn>p->expn)
{
pre=q;
q=q->next;
}
p->next=q;
pre->next=p;
}
return head;
}
void AddPolyn(LinkList heada,LinkList headb)
{
int sum;
LinkList pa,pb,pc,r;
pa=heada->next;pb=headb->next;pc=heada;
while(pa&&pb)
{
if(pa->expn==pb->expn)
{
sum=pa->coef+pb->coef;
if(sum!=0)
{
pa->coef=sum;
pc->next=pa;pc=pa;
pa=pa->next;
r=pb;pb=pb->next;delete r;
}
else
{
r=pa;pa=pa->next;delete r;
r=pb;pb=pb->next;delete r;
}
}
else if(pa->expn<pb->expn)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
}
pc->next=pa?pa:pb;
}
void output(LinkList head)
{
LinkList p;
p=head->next;
while(p!=NULL)
{
cout<<p->coef<<" "<<p->expn<<endl;
p=p->next;
}
}
int main()
{
LinkList heada,headb;
int m,n;
cin>>m>>n;
heada=ListInsert(m);
headb=ListInsert(n);
AddPolyn(heada,headb);
output(heada);
return 0;