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