从双重有界指针列表中删除元素

时间:2015-02-23 17:08:49

标签: c++ pointers

我正在开发一个项目,我创建了一个双有界指针列表,删除了几个元素,仍然可以读取列表。我有一个双界指针列表,但我在删除元素和保持列表双重限制时遇到问题。这会在尝试打印列表时导致问题。 以下是我在while循环中放置的IF语句,以帮助删除不需要的元素。我一直遇到分段错误(核心转储)。

if ((black2 != black)||(white2 != white)) {
        dump = help;
        help = help ->next;
        dump -> before = temp;
        temp -> next = help;
        help ->before = temp;
        delete dump; 
    }//if
    else { temp = help;
           help = help->next;
           help ->before = temp; }//else

2 个答案:

答案 0 :(得分:0)

要正确维护双向链表,您应该执行以下操作:

void remove(X *elt) {
    X* before = elt->before;
    X* after = elt->next;
    if (before != NULL) { // assuming first element points to NULL
        before->next = after;
    }
    else {
        first = after; // assuming first is a pointer to first element of list
    }
    if (after != NULL) { // assuming last element points to NULL
        after->before = before;
    }
    else {
        last = before; // assuming last is a pointer to last element
    }
    delete elt;
}

这样,您可以确保当前的元素正确指向彼此,处理删除第一个或最后一个元素的特殊情况。

但您已在标准模板库

中拥有std::list模板

答案 1 :(得分:0)

代码中的一个逻辑问题是行dump->before = temp。 这样做是因为它将dump的前一个节点指针设置为temp,而不是将temp定义为前一个节点。

正确的行应为temp = dump->before

PS:您的代码是正确的,假设您要删除的节点不是第一个或最后一个节点(并且您没有填充虚拟节点)。如果需要,您应该对这些案例进行检查。