链表合并函数调用后程序终止,定位到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
相关产品推荐
相关产品推荐

