c++ - 从链表中删除元素 (C++)

标签 c++

我目前正在努力理解为什么我的 removeElement() 函数实际上没有从 LinkedList 中删除节点。这是我的代码:

template<typename T>
void LinkedList<T>::remove(T element)  {
if (isEmpty()) {
    cout << "List is empty.";
}
else if (head == tail) {
    cout << "Only One" << endl;
    head == NULL;
    tail == NULL;
}
else {
    cout << "Multiple in List" << endl;
    Node<T>* curr = head;
    Node<T>* prev = curr;

    while (curr != NULL) {
        if (curr->element == element) {
            cout << "deleting " << element << endl;
            prev = curr->next;
            delete curr;
        }
        else {
            prev = curr;
            curr = curr->next;
        }

    }
 if(curr == NULL) {
 cout << element << " is not in list" << endl;
    }   
 }
}

这段代码有效地定位了链表中的元素,但是无论出于何种原因,删除当前节点并没有真正从链表中删除该元素;即使在将我的前一个节点重新分配给下一个节点之后。在此期间,我将继续寻找文档,这可能会阐明我这边几乎肯定是愚蠢的疏忽,但我们将不胜感激任何帮助。

更新后的代码现在给了我很多美妙的 string_alloc 错误:

template<typename T>
void LinkedList<T>::remove(T element)  {
Node<T>* current = head;
Node<T>* previous = current;

if (isEmpty()) {
    cout << "List is empty.";
}
else if (head == tail) {
    cout << "Only One" << endl;
}
else {
    cout << "Multiple Nodes in List" << endl;
    while (current != NULL) {
        if (current->element == element) {
            previous->next = current->next;
            delete current;
            break;

        }
        else {
            previous = current;
            current = current->next;
        }
    }
  }
}

此时我怀疑它更多地与我从一个节点过渡到另一个节点的方式有关,具体而言:

previous = current;
current = current -> next;

我仍然没有正确地为列表中的单个元素创建一个案例,只有当我试图删除任何节点时才会抛出错误。

最佳答案

你有几个问题:

问题1

else if (head == tail) {
    cout << "Only One" << endl;
    head == NULL;
    tail == NULL;
}

如果您的列表只有一个元素,您可以将 head 和 tail 设置为 null1,但永远不要释放元素本身。此外,如果列表中的那个元素不是您要删除的元素怎么办?

<子>1。参见问题 2。


问题2

您永远不会真正将 head 或 tail 设置为 null。

head == NULL;是一个 bool 表达式,检查是否 head等于NULL .这应该是 head = NULL; 2

<子>2。参见问题 3。


问题3

Don't use NULL .


问题4

prev = curr->next;

这只是改变局部指针prev指向不同的节点。您需要更改该节点的 next指针代替。应该是:

prev->next = curr->next;

问题5

您不考虑列表中有多个元素的特殊情况,但您要删除的元素是第一个或最后一个(这意味着必须重新分配头或尾)。


还有一些小事,比如可能在找到要删除的节点后立即返回(除非您试图删除所有符合条件的节点。您的意图不明确,没有评论)。此外,可以通过将其拆分为两个函数来提高可读性/可维护性,一个 Node<T> find(T element)和一个 void remove(Node<T> n) .这也应该使边缘情况更容易处理。但除了这些小事之外,上面的列表至少应该让您的代码按您预期的方式工作。

关于c++ - 从链表中删除元素 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47099833/

相关文章:

c++ - unsigned char 的按位运算

c++ - 公众好友交换成员(member)功能

c++ - 创建可测试代码

c++ - 如何使用 static const 变量初始化 static std::array ?

c++ - Boost directory_iterator 导致崩溃

c++ - 如何从任意客户端查找 DHCP 租约信息?

c++ - 在 C++ 中实现 double sqrt(double x)

c++ - 在 opencv 中绘制、编号和识别网格单元

c++ - std::ostringstream 未返回有效字符串

c++ - 当我混合有符号和无符号类型时会发生什么?