1096

题目网址: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;


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值