数据结构:一元多项式及其基本运算

1、实现方式:可采用线性表的顺序存储结构,但是当多项式的每个项的指数差别很大时,会浪费很多存储空间。所以采用链式存储方式表示,每一项可以表示成一个结点,结点的结构由存放系数的coef域,存放指数的expn域和指向下一个结点的next指针域组成。

2、链表结构:

 3、一元多项式的加法运算:

设La和Lb分别表示两个多项式。Lc表示和多项式。p,q,r分别表示指向单链表的当前项比较指数大小。
(1)若La->expn < Lb->expn,则结点p应是和多项式中的一项,将p复制到r,并使p后移。
(2)若La->expn = Lb->exp ,则将两个结点中的系数相加,当和不为0时,La的系数域加上Lb的系数域作为Lc的系数域;若和为0,则和多项式中没有这一项,p,q后移。
(3)若La->exp  > Lb->exp ,则将结点q复制到Lc中,q后移。

//多项式相加,po1 += po2
bool Add(Poly po1,Poly po2)
{
	PNode *p = po1->next;                   //p指向po1的第一个节点
	PNode *q = po2->next;                   //q指向po2的第一个节点
	PNode *pre = po1;
	PNode *temp;
	while(p != NULL && q != NULL)           //当两个多项式均未扫描结束时
	{
		if(p->expn < q->expn)               //如果p指向的多项式的指数小于q的指数,将p节点加入到和多项式中
		{
			pre->next = p;                  //将p节点加入到pre中
			pre = p;                        //p即为现在的pre节点
			p = p->next;                    //继续判断p的下一个节点
		}
		else if(p->expn > q->expn)          //将节点q插入到节点p之前,指针q指向原节点的下一个节点
		{
			pre->next = q;                  //将q节点加入到和多项式中
			pre = q;                        //q即为现在的pre节点
			q = q->next;                    //继续判断q的下一个节点
		}
		else if(p->expn == q->expn)         //若指数相同,则相应的系数相加
		{
			p->cofe += q->cofe;
			if(po1->cofe == 0)              //若系数和为0,则删除节点p与q,并将指针指向下一个节点
			{
				temp = p->next; 
				free(p);                    //删除节点p
				p = temp;                   //使指针p指向它原节点的下一个节点
				temp = q->next;
				free(q);                    //删除节点q
				q = temp;                   //使指针q指向它原节点的下一个节点
			}
			else
			{
				pre->next = p;              //由于将两个多项式的和存储到p,所以将p加入到pre中
				pre = p;
				p = p->next;
				temp = q->next;
				free(q);                    //将po2链中相应项释放掉,和放到po1链中
				q = temp;

			}
				
		}
	}

	//若多项式中还有剩余,则将剩余的节点加入到和多项式中
	pre->next = p ? p : q;
	return true;
}

4、一元多项式的减法运算:

算法:将减数多项式的所有系数先变为相反数,然后调用多项式相加的函数进行运算。

//多项式相减,po1 -= po2
bool Sub(Poly po1,Poly po2)                 //相减就是先将减数中每一项的系数变为负,再将两个多项式相加
{
	PNode *p = po1->next;                   //p指向po1的第一个节点
	PNode *q = po2->next;                   //q指向po2的第一个节点
	PNode *pre = po1;
	PNode *temp;
	while(q->next != NULL)                  //将q中的每一项的系数变为负
	{
		q->cofe = 0 - q->cofe;
		q = q->next;
	}
	q = po2->next;                          //上一个循环将q指向最后一个节点,现在重新使q变成po2->next
	while(p != NULL && q != NULL)           //当两个多项式均未扫描结束时
	{
		if(p->expn < q->expn)               //如果p指向的多项式的指数小于q的指数,将p节点加入到和多项式中
		{
			pre->next = p;                  //将p节点加入到pre中
			pre = p;                        //p即为现在的pre节点
			p = p->next;                    //继续判断p的下一个节点
		}
		else if(p->expn > q->expn)          //将节点q插入到节点p之前,指针q指向原节点的下一个节点
		{
			pre->next = q;                  //将q节点加入到和多项式中
			pre = q
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值