我有一个已排序的链接列表,我试图创建一个函数来删除用户传递给nameToSearch的任何内容。但我一直在犯错。以下是我到目前为止的内容
void deleteProduct(NodePtr head, char* nameToSearch)
{
NodePtr nodeUnderEdit = findNodeByName(head, nameToSearch);
if (nodeUnderEdit == NULL)
{
cout<<"\n ERROR: Product not found \n";
}
else
{
delete nodeUnderEdit;
nodeUnderEdit = nodeUnderEdit->next;
}
}
答案 0 :(得分:6)
delete nodeUnderEdit;
nodeUnderEdit = nodeUnderEdit->next;
如果您先删除nodeUnderEdit
,则nodeUnderEdit->next
将会丢失。
您需要首先确保nodeUnderEdit下一个节点连接到nodeUnderEdit->next
之前的节点,然后您可以执行删除。
答案 1 :(得分:2)
单链表总是存在问题。
出现问题是因为从链接列表中删除当前节点需要修改 previous 节点中的指针 - 您无法直接访问该节点。
处理此问题的一种方法是使用带有标记的列表(包含您认为是列表末尾的值的最终节点)。在这种情况下,您可以将 next 节点中的值复制到当前节点,然后从列表中删除下一个节点。
答案 2 :(得分:1)
要删除单链表中的项目,必须将指针从Previous记录更改为指向Next记录。您的“findNodeByName”仅仅找到具有匹配名称的节点是不够的。它必须在排序顺序中找到其前一个节点,然后设置要删除的记录的下一个点的记录的Next指针。只有在更新了Previous记录的Next指针后,才能删除搜索到的记录。