C++自定义insertAfter函数是否可将seat插入到driver_seat之后
代码问题分析与修复方案
1. insertAfter函数逻辑错误
当前的插入逻辑无法实现预期效果,原代码第二行等价于node->next_node = node->next_node,执行后没有任何实际修改:
void SeatNode::insertAfter(SeatNode* node) { // 插入this节点到node之后 this->next_node = node->next_node; // 该行逻辑正确,将当前节点的后继指向node原来的后继 node->next_node = this->next_node; // 错误:此处应该指向当前节点this,而非this的后继 }
修正后的函数实现:
void SeatNode::insertAfter(SeatNode* node) { this->next_node = node->next_node; node->next_node = this; }
2. 局部对象生命周期问题
createSeatReservation中定义的SeatNode seat(p)是栈上的局部变量,函数执行结束后该对象会被自动销毁,即使插入逻辑正确,链表中保存的也会是野指针,触发未定义行为。需要改为堆分配对象延长生命周期:
// 注意:堆分配的节点需要手动管理释放,避免内存泄漏 void Compact::createSeatReservation(Passenger p) { SeatNode* seat = new SeatNode(p); seat->insertAfter(&this->driver_seat); }
3. 调用参数错误
你的需求是把新节点插到driver_seat之后,按照insertAfter的语义(将当前对象插入到参数节点的后面),你应该传入driver_seat的指针,而非driver_seat.getNextNode(),否则新节点会被插入到driver_seat原有后继节点的后面,无法实现driver_seat直接指向新节点的效果。
内容的提问来源于stack exchange,提问作者LoopGod
相关产品推荐
相关产品推荐

