C++链表:它不会删除第一个输入

C++链表:它不会删除第一个输入,c++,C++,我想问一下为什么我的删除功能在第一个输入上不起作用,但在第二个输入上,它起作用了。非常感谢你的帮助 void deleteStudent(){ cout<<endl; cout<<"~DELETING A STUDENT~"<<endl; cout<<endl; string deletion; cout << "Enter student ID number: "; cin >> deletion; student *

我想问一下为什么我的删除功能在第一个输入上不起作用,但在第二个输入上,它起作用了。非常感谢你的帮助

void deleteStudent(){
cout<<endl;
cout<<"~DELETING A STUDENT~"<<endl;
cout<<endl;

string deletion;
cout << "Enter student ID number: ";
cin >> deletion;

student *prev = head;
student *current = head->next;

while (current)
{
    if (current->studentNum == deletion){
        prev->next = current->next;
        delete current;
        return;
    }
    prev = current;
    current = current->next;
}
if (!current){
    cout << "That value is not in the list" << endl;
}
}这行是错的

学生*当前=头部->下一步

见下面我的更正

void deleteStudent(){
cout<<endl;
cout<<"~DELETING A STUDENT~"<<endl;
cout<<endl;

string deletion;
cout << "Enter student ID number: ";
cin >> deletion;

student *prev = head;
student *current = head;

while (current)
{
    if (current->studentNum == deletion){
        if(current == head)
           head = prev;
        prev->next = current->next;
        delete current;
        return;
    }
    prev = current;
    current = current->next;
}
if (!current){
    cout << "That value is not in the list" << endl;
}
} 
根据你的代码, 看起来可变头部是您的第一个节点。 电流对应于第二节点

    while (current)
    {
        if (current->studentNum == deletion){
            prev->next = current->next;
            delete current;
            return;
        }
        prev = current;
        current = current->next;
    }
在上面的代码中,您基本上是从第二个节点迭代到列表的末尾。这就是为什么不能删除第一个节点

将while循环中的条件从current更改为prev。
请注意,删除第一个节点基本上就是删除指向整个列表的指针,可能会导致不必要的行为,这可以通过使用检查条件来避免,检查您是否正在删除第一个节点,如果是,则相应地更新与列表对应的指针。

您使用的Java方法很糟糕

例如,最开始的代码调用未定义的行为

student *prev = head;
student *current = head->next;
因为在一般情况下,水头可以等于nullptr

而且头部可以是应该删除的节点。但是你跳过了它

此代码段

student *prev = head;
student *current = head->next;

while (current)
{
    if (current->studentNum == deletion){
        prev->next = current->next;
        delete current;
        return;
    }
    prev = current;
    current = current->next;
}
if (!current){
    cout << "That value is not in the list" << endl;
}
可以按以下方式重写

student **current = &head;

while ( *current != nullptr && ( *current )->studentNum != deletion )
{
    current = &( *current )->next;
}

if ( *current != nullptr )
{
    student *tmp = *current;
    *current = ( *current )->next;
    delete tmp;
}
else
{
    cout << "That value is not in the list" << endl;
}

头是不指定的,所以它永远不会改变。你期望什么?当然不会,你现在的节点是head->next。之前,将head->StudentNumeExcept作为学习练习,你真的不应该使用自己的链表实现。您也很少希望实际使用链表,对于现代CPU来说,链表是一种性能非常差的数据结构,在许多情况下,std::vector是更好的选择。