You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:48:00