C++链表实现多项式相加时poly2与sum一同被修改是什么原因
问题根因
你的代码问题出在addPoly函数的节点复用逻辑:
- 当两个多项式的项指数不等时,你没有创建新节点存储结果,直接把
poly1/poly2的原节点指针赋值给t,后续将t挂载到sum链表时,会修改原节点的next指针,直接破坏原有两个多项式的链表结构。 - 你的测试用例中
poly2的首项是7x5,指数大于poly1的首项指数4,所以这个原节点被直接挂到了sum的头部,紧接着这个节点的next被修改为相加得到的新节点11x4,完全覆盖了poly2原来的后续节点链。所以你遍历poly2时从原头节点出发,实际走的就是sum的整条链表,输出自然和sum完全一致。
修复方案
修改addPoly逻辑,所有结果节点都创建新副本,不要直接复用原多项式的节点,避免修改原链表:
//修改后的多项式相加函数 void addPoly(Node *p1,Node *p2,Node **sum){ Node *t,*last = NULL; while(p1&&p2){ t=new Node; t->next = NULL; if(p1->exponent==p2->exponent){ t->coefficient=p1->coefficient+p2->coefficient; t->exponent=p1->exponent; p1=p1->next; p2=p2->next; }else if(p1->exponent>p2->exponent){ // 复制p1节点内容,不直接用原指针 t->coefficient = p1->coefficient; t->exponent = p1->exponent; p1=p1->next; }else{ // 复制p2节点内容,不直接用原指针 t->coefficient = p2->coefficient; t->exponent = p2->exponent; p2=p2->next; } if(*sum==NULL) *sum=last=t; else{ last->next=t; last=t; } } // 剩余节点也要复制新节点,不要直接挂原链表 while(p1){ t = new Node; t->coefficient = p1->coefficient; t->exponent = p1->exponent; t->next = NULL; last->next = t; last = t; p1 = p1->next; } while(p2){ t = new Node; t->coefficient = p2->coefficient; t->exponent = p2->exponent; t->next = NULL; last->next = t; last = t; p2 = p2->next; } }
修改后原poly1、poly2的链表结构不会被修改,输出会符合预期。
内容的提问来源于stack exchange,提问作者SAURABH KUMAR
相关产品推荐
相关产品推荐

