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

链表合并函数调用后程序终止,定位到p->next=list2处出错

问题分析与解决方案

核心错误原因

在mergeLists函数中,这段循环逻辑直接导致程序崩溃:

p=list;
while(p!=nullptr){
    p=p->next;
}
p->next=list2;

当循环结束时,p已经指向nullptr(只有当p为空时才会退出循环),此时访问p->next属于空指针非法解引用,触发程序终止。

修复步骤

1. 修正循环终止条件

调整循环逻辑,让p停在链表的最后一个有效节点(即p->next为nullptr时停止),这样循环结束后p是合法指针,可安全修改其next指向list2:

if(list!=nullptr && list2!=nullptr){
    // 使用局部变量,避免修改全局指针带来的副作用
    node* temp = list;
    // 停在最后一个节点,而非走到nullptr
    while(temp->next != nullptr){
        temp = temp->next;
    }
    temp->next = list2;
    display(1);
}

2. 避免全局变量干扰

原代码大量使用全局指针(p、q、r等),容易在不同函数间互相影响,建议在函数内使用局部变量(如上面的temp),减少全局变量的依赖。

3. 优化函数分支逻辑(可选)

合并冗余的分支判断,同时可将合并后的list2置空,避免后续操作误修改合并后的链表:

void mergeLists(node *list,node *list2)
{
    if (list == nullptr && list2 == nullptr){
        cout << "Both lists are empty";
        return;
    }
    if (list == nullptr){
        display(2);
        return;
    }
    if (list2 == nullptr){
        display(1);
        return;
    }
    // 执行合并
    node* temp = list;
    while(temp->next != nullptr){
        temp = temp->next;
    }
    temp->next = list2;
    // 可选:将全局list2置空,避免后续操作干扰合并结果
    ::list2 = nullptr;
    display(1);
}

其他潜在问题提示

  • delFront函数仅处理list,未实现list2的删除功能,可能不符合完整需求;
  • main函数中重新定义了局部变量choice,与全局choice变量重名,易造成混淆;
  • 程序未处理内存泄漏,退出前应遍历链表释放所有节点内存。

内容的提问来源于stack exchange,提问作者Mufazzal Gujjar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:12:44