1

我想在双向链表中插入一个节点。我通过了位置,多项式的新系数及其幂。我没有编译错误,但是当我使用 Visual Studio 运行它时,我在 linux (g++) 中遇到了分段错误和访问冲突写入位置。

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;
}

我做错了什么,我该如何解决?

4

5 回答 5

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;
于 2012-11-13T03:58:11.960 回答
1

pos->prev可能为 NULL 或未初始化。您必须在使用它们之前验证您的输入...

于 2012-11-13T03:59:39.717 回答
0

请检查在执行程序的任何实例中是否 pos 可以是列表中的第一个节点。如果是,那么当您访问 NULL 指针的成员时,它将导致分段错误。

在编程时始终考虑极端情况,并确保为它们设置了所需的条件。

于 2012-11-13T04:58:59.973 回答
0

我想知道你为什么要自己实现一个双向链表。您可以定义一个structorclass其中包含coefficientpower成员并将其用作 的值类型std::list。这将为您免费提供许多列表操作(例如插入和删除元素)。作为奖励,std::list带有用于标准算法的适当迭代器(而不是位置指针)。

由于Polynomial缺少类的其余部分(它是一个类,而不仅仅是一个命名空间,是吗?),很难提供更具体的帮助。

于 2012-11-13T07:49:43.443 回答
0

当您尝试取消引用 NULL 指针时,通常会发生分段错误。

在处理指针时使用 NULL 检查被认为是一种很好的做法。在这种情况下,似乎 pos->prev 是 NULL,这会导致分段错误。

于 2012-11-13T09:40:24.937 回答