多项式求和(链表实现)

多项式的求和我是先分为两个大项,其中每个大项的项数不限,但是每个大项中的指数不能相同,因为既然把它看成了一个大项,那么它内部指数相同的项系数应该是已经合并过的。

然后由于要两个大项合并为一个大项,所有我是创了三个链表来存放,一个链表存放一个大项,每个结构体里面还有两个成员,反别是每一项的系数和指数。

在相加时要判断特殊情况,比如:指数为零,系数为零,两个大项中指数相同的系数相加为零的情况,这些情况都要单独考虑,然后就是迭代送搜就可以,就是第一个大项里面的每一项以此出来去第二个大项里面寻找指数相同的一项,再把两个的系数相加即可。

最后输出的时候也要注意格式,比如什么时候输出+。什么时候不输出,这就需要很多条件语句来控制了。

具体实现的代码段如下:

#include <iostream>
#include <stdio.h>
using namespace std;
#define ERROR -1
#define OK 1
typedef int status;
typedef struct xiang{
	int a;//各项的系数 
	int b;//各项的指数 
	struct xiang *next;
}xiang,*LNode;
status initlist(LNode &L);//创建链表 
status inputlist(LNode &L,int n);//输入链表中的值 
status unionlist(LNode K,LNode B,LNode &L);//计算多项式合并结果 
status sortlist(LNode &L);//对结果进行整理 
status outputlist(LNode L,int n);//输出结果 
int main()
{
	int n,m,t;
	LNode K,B,L;//三个链表,一个为第一个大项,一个为第二个大项,最后一个为结果 
	initlist(K);
	initlist(B);
	initlist(L);//创建三个链表 
	cout<<"请输入第一大项的项数:";
	cin>>n;
	inputlist(K,n);
	cout<<"请输入第二大项的项数:";
	cin>>m;
	inputlist(B,m);
	t=unionlist(K,B,L);//返回值为指数为零的那几项的系数 
	sortlist(L);
	cout<<"合并完之后的结果为:";
	outputlist(L,t);//输出结果 
	cout<<endl;
}
status initlist(LNode &L)//分别创建三个链表 
{
	L=new xiang;
	if(!L)
	return ERROR;
	L->next=NULL;
	return OK;
}
status inputlist(LNode &L,int n)//分别输入各项系数和指数 
{
	int i;
	LNode p,r;
	r=L;
	for(i=0;i<n;i++)
	{
		printf("请输入第%d项的系数和指数:",i+1);
		p=new xiang;
		cin>>p->a>>p->b;
		r->next=p;
		p->next=NULL;
		r=p;
	}
	return OK;
}
status unionlist(LNode K,LNode B,LNode &L)//多项式相加(重点步骤) 
{
	int t;
	t=0;
	LNode p,r,q,w,s,o;
	r=L;
	q=K->next;
	s=K;
	w=B->next;
	o=B;
	while(s->next)//搜寻K表,也就是第一大项中指数为零的部分,并将此系数赋给t 
	{
		if(q->b==0)
		{
			t=t+q->a;
			s->next=q->next;
		}
		else
		{
			s=s->next;
		}
		q=q->next;
	}
	while(o->next)//搜寻B表,也就是第二大项中指数为零的部分,并将此系数赋给t 
	{
		if(w->b==0)
		{
			t=t+w->a;
			o->next=w->next;
		}
		else
		{
			o=o->next;
		}
		w=w->next;
	}
	q=K->next;
	w=B->next;
	while(q)//两个for循环实现两个大项中指数相同时的系数相加操作,相加完之后将系数赋为零 
	{
		w=B->next;
		while(w)
		{
			if(q->b==w->b)
			{
				p=new xiang;
				p->a=q->a+w->a;
				p->b=q->b;
				r->next=p;
				p->next=NULL;
				r=p;
				q->a=0;
				w->a=0;
			}
			w=w->next;
		}
		q=q->next;
	}
	q=K->next;
	w=B->next;
	while(q)//搜寻第一大项里面没有相加过的项,也就是和第二个大表中没有此指数的项 
	{
		if(q->a!=0)
		{
			p=new xiang;
			p->a=q->a;
			p->b=q->b;
			r->next=p;
			p->next=NULL;
			r=p;
		}
		q=q->next;
	}
	while(w)//搜寻第二大项里面没有相加过的项,也就是和第一个大表中没有此指数的项
	{
		if(w->a!=0)
		{
			p=new xiang;
			p->a=w->a;
			p->b=w->b;
			r->next=p;
			p->next=NULL;
			r=p;
		}
		w=w->next;
	}
	return t;//返回的值为指数为零的所有项的系数和 
}
status sortlist(LNode &L)//冒泡排序算法,将最后的结果按照指数从大到小输出 
{
	LNode p,r,q,e;
	p=L->next;
	int i=0,j,k,t;
	while(p!=NULL)
	{
		i++;
		p=p->next;
	}
	p=L->next;
	e=L;
	q=p->next;
	for(j=0;j<i-1;j++)
	{
		for(k=0;k<i-1-j;k++)
		{
			if(p->b<q->b)
			{
				t=p->a;
				p->a=q->a;
				q->a=t;
				t=p->b;
				p->b=q->b;
				q->b=t;
			}
			p=p->next;
			q=q->next;
		}
		p=e->next;
		q=p->next;
	}
	return OK;
}
status outputlist(LNode L,int n)//输出L表,也就是此和 
{
	LNode p;
	p=L->next;
	while(p)//输出条件比较多,故用if分支语句 
	{
		if(p->a==0&&p->next==NULL)//如果这一节点里的系数为零且为最后一个节点,则不输出这一项,只输出常数 
		{
			p=p->next;
			printf("+%d",n);
			continue;
		}
		else if(p->a==0)//如果指数相同的两项的系数相加为零,则把这一项跳过不输出 
		{
			p=p->next;
			continue;
		}
		else if(p->next==NULL)//如果为最后一项但是系数不为零,就输出该项的内容且输出常数 
		{
			printf("%dx^%d+",p->a,p->b);
			printf("%d",n);
		}
		else
		{
			if(p->next->a==0)
			{
				printf("%dx^%d",p->a,p->b); 
			}
			else
			{
				printf("%dx^%d+",p->a,p->b); 
			}
		}
		p=p->next;
	} 
	return OK;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值