一元多项式相加(基于链表的实现)

题干:

求两个一元多项式 A(x) = a0 + a1x + a2x2 + … + anxn 和 B(x) = b0 + b1x + b2x2 + … + bmxm 的和

基于三个链表的实现

原理讲解:

为一元多项式 A(x)=12+2x+3x^{2}+3x^{3}+6x^{4}+7x^{5}

                       B(x)=-3+4x+4x^{3}+6x^{4}+7x^{5}+8x^{6}

这样就可以得到一个C(x)=9+6x+3x^{2}+7x^{3}+12x^{4}+14x^{5}+8x^{6}

用图形的表示方法如下所示:

A,B,C链表有两个变量一个是系数,一个是指数,如果指数相同,则A,B相加得C

所以定义一个结构体:

typedef struct PNode
{
	float coef;
	int expn;
	struct PNode *next;
}PNode,*Polynomial;

代码分析:

当定义完结构体之后,要创建链表:

void CreatePolyn(Polynomial &P,int n)
{
	int i;
	Polynomial s,pre,q;
	P=new PNode;
	P->next=NULL;
    //变量n表示链表长度即多项式有多少项
	for(i=1;i<=n;++i)
	{
		s=new PNode;
        //输入多项书的指数和系数
		cin>>s->coef>>s->expn;
		pre=P;
		q=P->next;
		while(q&&q->expn<s->expn)
		{
			pre=q;
			q=q->next;
		}
		s->next=q;
		pre->next=s;
	}
}

当定义完A,B,多项式链表之后,把相同指数的项进行相加操作:

void AddPolyn(Polynomial &L,Polynomial L1,Polynomial L2)
{
	Polynomial p1,p2,p,q;
	p=L=L1;
    //p1为链表1的指针
	p1=L1->next;
    //p2为链表2的指针
	p2=L2->next;
	while(p1&&p2)
	{
           //指数相同的时候系数相加
		if(p1->expn==p2->expn)
		{
			int sum=p1->coef+p2->coef;
			if(sum!=0)
			{
				p1->coef=sum;
				p->next=p1;
				p=p1;
				p1=p1->next;
				
				q=p2;
				p2=p2->next;
				delete q;
			}
			else
			{
				q=p1;
				p1=p1->next;
				delete q;
				
				q=p2;
				p2=p2->next;
				delete q;
			}
		}
		else if(p1->expn<p2->expn)
		{
			p->next=p1;
			p=p1;
			p1=p1->next;
		}
		else
		{
			p->next=p2;
			p=p2;
			p2=p2->next;
		}
	}
	p->next=p1?p1:p2;
}

最后,输出打印链表,即输出多项式各项:

void output(Polynomial L)
{
	Polynomial p=L->next;
	while(p)
	{
		cout<<p->coef<<"x^"<<p->expn;
		if(p->next)
		    cout<<"+";
		p=p->next;
	}
	cout<<endl;
}

完整代码:

#include<iostream>
using namespace std;

typedef struct PNode
{
	float coef;
	int expn;
	struct PNode *next;
}PNode,*Polynomial;


void CreatePolyn(Polynomial &P,int n)
{
	int i;
	Polynomial s,pre,q;
	P=new PNode;
	P->next=NULL;
	for(i=1;i<=n;++i)
	{
		s=new PNode;
		cin>>s->coef>>s->expn;
		pre=P;
		q=P->next;
		while(q&&q->expn<s->expn)
		{
			pre=q;
			q=q->next;
		}
		s->next=q;
		pre->next=s;
	}
}

void AddPolyn(Polynomial &L,Polynomial L1,Polynomial L2)
{
	Polynomial p1,p2,p,q;
	p=L=L1;
	p1=L1->next;
	p2=L2->next;
	while(p1&&p2)
	{
		if(p1->expn==p2->expn)
		{
			int sum=p1->coef+p2->coef;
			if(sum!=0)
			{
				p1->coef=sum;
				p->next=p1;
				p=p1;
				p1=p1->next;
				
				q=p2;
				p2=p2->next;
				delete q;
			}
			else
			{
				q=p1;
				p1=p1->next;
				delete q;
				
				q=p2;
				p2=p2->next;
				delete q;
			}
		}
		else if(p1->expn<p2->expn)
		{
			p->next=p1;
			p=p1;
			p1=p1->next;
		}
		else
		{
			p->next=p2;
			p=p2;
			p2=p2->next;
		}
	}
	p->next=p1?p1:p2;
}

void output(Polynomial L)
{
	Polynomial p=L->next;
	while(p)
	{
		cout<<p->coef<<"x^"<<p->expn;
		if(p->next)
		    cout<<"+";
		p=p->next;
	}
	cout<<endl;
}

int main()
{
	Polynomial L1,L2,L;
	int n;
	cin>>n;
	CreatePolyn(L1,n);
	
	cin>>n;
	CreatePolyn(L2,n);
	
	AddPolyn(L,L1,L2);
	output(L);
}



 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值