我正在开发一个项目,我创建了一个双有界指针列表,删除了几个元素,仍然可以读取列表。我有一个双界指针列表,但我在删除元素和保持列表双重限制时遇到问题。这会在尝试打印列表时导致问题。 以下是我在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
答案 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:您的代码是正确的,假设您要删除的节点不是第一个或最后一个节点(并且您没有填充虚拟节点)。如果需要,您应该对这些案例进行检查。