笔记原因
网上很多的利用单链表计算多项式的和,会出现问题,例如
a 1 2 1 2
b 1 2 1 2
这两个多项式相加,有两次相等的情况按照他们的方法会建立两个节点
解决方法
//用于多项式相加
//要先对p1,p2排序好,升序
while((p1!=NULL)&&(p2!=NULL)){//两个都没到尾巴就循环
//p1小的情况
if(p1->up<p2->up){
if(p3->up!=p1->up){//与p3的指数不相等的时候,就向后移动,并连接p1
p3->next=p1;
p3=p1;
p3->next=NULL;
}
else{//p1与p3的指数相等的时候,改变底数的值,不移动p3
p3->down=p3->down+p1->down;
p1=p1->next;
}
}
//重点注意的是,p3的位置在两数相等的时候,只是移动到了两个相等数中的其中的一个的位置,
//还可以通过p3判断后续,是否有与改两个数相等的数
else if(p1->up==p2->up){
/*相等分两种情况,1、上一次保存的p3的指数与该次仍然相等;2、第一次碰到指数相等*/
if(p3->up==p1->up){//第二次还是同样指数的情况
p3->up=p1->up;
p3->down=p3->down+p1->down+p2->down;
p1=p1->next;
p2=p2->next;
}
else{//第一次碰到指数相等的情况
p3->next=p1;
p3=p1;
p3->down=p1->down+p2->down;
p1=p1->next;
p2=p2->next;
p3->next=NULL;//一定要写在最后,写在p1位置改变之前,会影响p1
}
}
//p2小的情况
else{
if(p3->up!=p2->up){//与p3的指数不相等的时候,就向后移动,并连接p2
p3->next=p2;
p3=p2;
p3->next=NULL;
}
else{//p2与p3的指数相等的时候,改变底数的值,不移动p3
p3->down=p3->down+p2->down;
p2=p2->next;
}
}
}
//最后处理,有一个没循环完
p3->next=p1?p1:p2;
拓展
这种方法也可以用于,单链表的合并去重的操作。
创作仅为了做个笔记,如有不足,希望批评指正!