我想在双重链接列表中插入一个节点。我处于该位置,即多项式的新系数及其功率。我没有编译错误,但是当我使用Visual Studio运行时,我会在Linux(G )和访问违规位置中获得细分故障。
program.exe中的0x00BD20BA的未经处理的例外
void Polynomial::insert( Term *pos, double newCoefficient, int power )
{
Term *newTerm = new Term; // create a new node to insert
// Link the new node to previous and next, given the position
newTerm->prev = pos->prev;
newTerm->next = pos;
newTerm->prev->next = newTerm; // Here's where I'm getting the error
newTerm->next->prev = newTerm;
// change the coefficient and power
newTerm->coefficient = newCoefficient;
newTerm->power = power;
}
我在做什么错,我该如何解决?
好吧,如果pos
是第一个节点,则pos->prev
必须为NULL
。在这种情况下,语句newTerm->prev->next = newTerm;
会崩溃,因为没有NULL->next
!
您应该明确检查pos
是否是列表中的第一个节点,并相应地放置newNode
。
// Link the new node to previous and next, given the position
newTerm->prev = pos->prev;
newTerm->next = pos;
if(pos->prev) newTerm->prev->next = newTerm;
newTerm->next->prev = newTerm;
pos->prev
可能是无效的或不可分化的。您必须在使用之前验证输入...
请检查是否在执行程序的任何情况下是否可以是列表中的第一个节点。如果是这样,那么当您访问NULL指针的成员时,它将导致分割故障。
在编程时,请始终考虑极端情况,并确保您已为其提出条件。
我想知道为什么您自己实现双重链接列表。您可以定义包含coefficient
和power
成员的struct
或class
,并将其用作std::list
的值类型。这将为您免费提供许多列表操作(例如插入和删除元素)。作为奖励,std::list
带有适当的迭代器(而不是位置指针),用于标准算法中。
由于缺少Polynomial
类的其余部分(这是一个类,而不仅仅是名称空间,是吗?)很难提供更多的具体帮助。
分割故障通常会在您尝试放置空指针时发生。
在处理指针时使用零检查是一种好习惯。在这种情况下,pos-> prev是null,这导致了分割错误。