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是更好的选择。