我想在双向链表中插入一个Node。我通过了位置,多项式的新系数及其功效。我没有编译错误,但是当我用Visual Studio运行时,我在linux(g ++)中遇到了Segmentation错误,并且遇到了Access Violation Writing Location。
Program.exe中0x00bd20ba处的未处理异常:0xC0000005:访问冲突写入位置0xcdcdcdd9。
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;
}
我做错了什么以及如何解决这个问题?
答案 0 :(得分:1)
好吧,如果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;
答案 1 :(得分:1)
pos->prev
可能为NULL或未初始化。您必须在使用之前验证输入...
答案 2 :(得分:0)
请检查在任何执行程序的实例中,pos是否可以是列表中的第一个节点。如果是,那么当您访问NULL指针的成员时,它将导致分段错误。
在编程时始终考虑极端情况,并确保已为其提供所需的条件。
答案 3 :(得分:0)
我想知道为什么你自己实施一个双向链表。您可以定义包含struct
和class
成员的coefficient
或power
,并将其用作std::list
的值类型。这将为您提供免费的大量列表操作(例如插入和删除元素)。作为奖励,std::list
带有适当的迭代器(而不是位置指针),可用于标准算法。
由于缺少Polynomial
类的其余部分(它是一个类,而不仅仅是命名空间,是吗?),很难提供更具体的帮助。
答案 4 :(得分:0)
当您尝试取消引用NULL指针时,通常会发生分段错误。
在处理指针时使用NULL检查被认为是一种好习惯。在这种情况下,似乎pos-> prev为NULL,导致分段错误。