C++链表执行中间节点插入操作后遍历出现无限循环问题求助
问题原因分析
1. 核心死循环原因
case 4的两行指针赋值顺序完全错误:
temp->next=nodeToAdd; nodeToAdd->next=temp->next;
你先把temp的next指针指向了新节点nodeToAdd,再给nodeToAdd->next赋值时,取的temp->next已经是新节点本身,最终导致nodeToAdd->next = nodeToAdd,新节点自己指向自己形成环形结构。遍历链表走到该节点时会永远循环指向自己,无法走到NULL结束。
正确的赋值顺序应该是先保存原有的后续节点,再修改前驱节点的指针:
// 先让新节点指向原来temp的下一个节点 nodeToAdd->next = temp->next; // 再让temp指向新节点 temp->next = nodeToAdd;
2. 其他潜在问题
- 缺少位置合法性校验:如果输入的
pos小于1,或者大于当前链表的总长度,循环中temp会移动到空指针,后续访问temp->next会直接触发程序崩溃。 - 新节点指针未初始化:
new Node()创建的新节点next是野指针,哪怕赋值顺序改对,若插入位置是链表尾部,next没有主动设为NULL,遍历到尾部会访问非法内存。 - 未处理头部插入场景:如果输入
pos=1,当前逻辑会把节点插到第一个节点的后面,而不是真正的链表头部。 - 空链表处理逻辑不合理:原代码空链表时直接
return 0会强制退出程序,不符合菜单交互的逻辑。
修正后的case4参考代码
case 4: nodeToAdd=new Node(); cout<<"Enter Value - "; cin>>val; cout<<"Enter Position - "; cin>>pos; nodeToAdd->data=val; nodeToAdd->next=NULL; // 初始化新节点next为NULL if(head==NULL){ cout<<"List Is Empty"<<endl; break; } // 插入到头部的特殊情况处理 if(pos == 1){ nodeToAdd->next = head; head = nodeToAdd; break; } temp=head; int i=1; // 移动到pos-1的位置,同时校验位置是否合法 while(i < pos-1 && temp->next != NULL){ i++; temp=temp->next; } // 如果pos超过链表长度,给出提示 if(i < pos-1){ cout<<"插入位置超出链表长度"<<endl; delete nodeToAdd; // 避免内存泄漏 break; } // 正确顺序赋值 nodeToAdd->next = temp->next; temp->next = nodeToAdd; break;
内容的提问来源于stack exchange,提问作者NAMAN VERMA
相关产品推荐
相关产品推荐

