数据结构之链表创建一元多项式,求一元多项式之和

数据结构之链表创建一元多项式,求一元多项式之和

前言

在这里插入图片描述

对于一元多项式,我们完全可以利用线性表P(a0,a1,a2,…,an)表示,这样的线性表在求两个多项式相加等操作时确实简单,但是多于如下的多项式:

利用上述线性表将存储为S(1,0,0,0,0,…,3,…,2);这样的结构显然对内存造成浪费
为了解决以上问题,可以将上面的线性表改善为P((a1,e1),(a2,e2),…,(am,em))只存储系数不为0的项,下面是该线性表的链式存储结构的代码实现。

#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"

#define LEN sizeof(node);

typedef struct polynode
{
	int coef;//系数
	int exp;//指数
	struct polynode *next;
}node,*ListPolynode;

/*倒序创建一元多项式*/
void createPoly(ListPolynode L,int n)
{
	ListPolynode p;
	for (int i=n;i>0;i--)
	{
		p=(ListPolynode)malloc(sizeof(node));
		printf("请输入第%d项系数\n",i);
		scanf_s("%d",&p->coef);
		printf("请输入第%d项指数\n",i);
		scanf_s("%d",&p->exp);
		p->next=L->next;
		L->next=p;
	}
}
/*正序创建一元多项式*/
ListPolynode createPoly1(ListPolynode L,int n)
{
	ListPolynode p;
	ListPolynode head=L;
	for (int i=0;i<n;i++)
	{
		p=(ListPolynode)malloc(sizeof(node));
		printf("请输入第%d项系数\n",i+1);
		scanf_s("%d",&p->coef);
		printf("请输入第%d项指数\n",i+1);
		scanf_s("%d",&p->exp);
		L->next=p;
		p->next=NULL;
		L=L->next;
	}
	return head;
}
/*打印一元多项式*/
void printfPoly(ListPolynode L)
{
	ListPolynode p=L->next;
	while(p)
	{
		printf("%d*x^%d ",p->coef,p->exp);
		p=p->next;
	}
	printf("\n");
}

/*多项式相加*/
void addPoly(ListPolynode La,ListPolynode Lb)
{
	ListPolynode currenLa=La->next;//指向La的当前结点
	ListPolynode currenLb=Lb->next;//指向Lb的当前结点
	ListPolynode temp;//待释放空间的临时结点
	ListPolynode pre=La;/*位置指针,指向和多项式La,利用pre修改La*/
	int sum;//相同指数结点系数之和
	while (currenLa!=NULL&&currenLb!=NULL)
	{
		if (currenLa->exp<currenLb->exp)//La的当前结点指小于于Lb的当前结点指数
		{
			//Lb的当前位置不变,La当前位置后移
			pre->next=currenLa;
			pre=pre->next;
			currenLa=currenLa->next;
		} 
		else if (currenLa->exp==currenLb->exp)//La的当前结点指数等于Lb的当前结点指数
		{
			sum=currenLa->coef+currenLb->coef;
			if (sum!=0)
			{
				//将La当前结点的系数改为sum,并链接到pre;将La的当前结点后移,之后过河拆桥将La的当前结点释放
				currenLa->coef=sum;
				pre->next=currenLa;
				pre=pre->next;
				currenLa=currenLa->next;
				temp=currenLb;
				currenLb=currenLb->next;
				free(temp);
			} 
			else
			{
				temp=currenLa->next;
				free(currenLa);//过河拆桥干掉La当前结点
				currenLa=temp;

				temp=currenLb->next;
				free(currenLb);//策略雷同,过河拆桥
				currenLb=temp;
			}
		}
		else//La的当前结点指数大于Lb的当前结点指数
		{
			//Lb当前位置添加到La当前位置之前,同时Lb向后移动一位,La向后移动一位
			pre->next=currenLb;
			pre=pre->next;
			currenLb=currenLb->next;
		}
	}

	if (currenLa!=NULL)//La未结束,将其全部链接到pre
	{
		pre->next=currenLa;
	}
	else//若Lb未结束,将其全部链接到pre
	{
		pre->next=currenLb;
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	ListPolynode La=(ListPolynode)malloc(sizeof(node));
	La->next=NULL;
	printf("请输入创建一元多项式的项数\n");
	int n;
	scanf_s("%d",&n);
	createPoly1(La,n);
	printfPoly(La);

	ListPolynode Lb=(ListPolynode)malloc(sizeof(node));
	Lb->next=NULL;
	printf("请输入创建一元多项式的项数\n");
	scanf_s("%d",&n);
	createPoly(Lb,n);
	printfPoly(Lb);

	addPoly(La,Lb);
	printfPoly(La);



	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红目香薰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值