数据结构问题——一元多项式相乘

void multiplication(NODE *head1, NODE *head2, NODE *head3)
{
	NODE *p1 = head3, *p2 = head3;
	NODE *h1 = head1->next, *h2 = head2->next;
	NODE *p3 = head3;
	while (h1)//多项式乘法运算转化为加法运算,注意双重循环控制乘法的运算
	{
		while (h2)
		{
			int coef = h1->coef*h2->coef;
			if (coef == 0)//系数为0,则相应的此项为0,向下移动
			{
				h2 = h2->next;
				continue;
			}
			//系数直接相加
			int exp = h1->exp + h2->exp;
			if (p1->next == NULL)//此时结果中还没有多项式
			{
				NODE *new_x = (NODE*)malloc(sizeof(struct node));
				new_x->coef = coef;
				new_x->exp = exp;
				p1->next = new_x;
				new_x->next = NULL;
			}//加入新的节点
			else
			{
				if (p3->next&&exp > p3->next->exp)
				{
					p2 = p3;
					while (p2->next&& exp > p2->next->exp)
					{
						p2 = p2->next;
						p3 = p2;
					}
				}
				else
				{
					while (p2->next&& exp > p2->next->exp)//大于下一个节点的系数
					{
						p2 = p2->next;
						p3 = p2;
					}
				}
				NODE *temp = p2->next;//指向下一个节点
				if (p2->next == NULL)//说明系数exp大于p2中所有的系数节点
				{
					NODE *new_x = (NODE*)malloc(sizeof(struct node));
					new_x->coef = coef;
					new_x->exp = exp;
					p2->next = new_x;
					new_x->next = NULL;
				}
				else if (temp->exp == exp)//两者指数相等的情况
				{
					temp->coef += coef;
					if (temp->coef == 0)//指数相等,但系数相加为0的情况,删除当前的节点
					{
						NODE *dele;
						dele = temp->next;
						p2->next = dele;
						free(temp);//引入中间节点,删除当前的节点
					}
				}
				else if (temp->exp > exp)//在前面插入相应的指数,两个指数中间大小的指数,前后两个中间大小的指数
				{
					NODE *pnew = (NODE*)malloc(sizeof(struct node));
					pnew->coef = coef;
					pnew->exp = exp;
					p2->next = pnew;
					pnew->next = temp;
				}//两者之间插入中间的数组
			}
			h2 = h2->next;
			p2 = head3;
		}
		h2 = head2->next;
		h1 = h1->next;//注意循环的维持
	}
	if (head3->next == NULL)//结果的链表为空
	{
		NODE *last = (NODE*)malloc(sizeof(struct node));
		last->coef = 0;
		last->exp = 0;
		last->next = NULL;//注意链表的结束
		head3->next = last;
	}//注意最后为0的情况的考虑
	return;
}

1、一元多项式乘法的思路,注意转化为一元多项式相加,相乘的本质即为相加

2、关键在于指数大小的讨论,应该为三重循环,指数相等时,判断系数是否为0,系数为0,则删除当前节点,系数大于当前链表中所有节点,则在链表的最后加上相应的节点,在两者之间,即插入节点的操作

3、此处避免超时有一个小优化,如果每次找的节点都在最后,每次寻找时再引入一个节点作为记忆化的搜索,即从上一次搜索的节点开始找,避免每次都从头开始找

4、注意小细节,当结果的链表为空时,注意赋值为0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值