如果要删除的项目不在列表中,如何 return `false`
How to return `false` if item you want to delete isn't in list
我正在尝试从链接列表中删除,return true
如果成功删除,return false
如果喜欢的列表中的号码不成功在列表中。问题是如果该项目不在列表中,我不知道如何 return false
。我什至不知道如何检查它是否在列表中。请帮忙。
bool list::deleteElement(int element)
{
node *curr, *prev;
prev = NULL;
if(head!=NULL)
{
for(curr=head; curr->item!=element&&curr!=NULL;curr= curr->next)
{
prev=curr;
}
if(curr!=NULL)
{
if(prev==NULL)
{
head = head->next;
delete curr;
numberofelements--;
return true;
}
else
{
prev->next = curr ->next;
delete curr;
return true;
}
}
return false;
}
}//end of function
您的代码非常接近正确。
您不需要显式检查 head
是否为 NULL。您的逻辑可以隐式处理这种情况。删除该测试后,return false;
将成为函数的最后一行。
您需要在 for 循环中撤销检查,这样您就不会尝试取消引用 NULL 指针:
for (curr = head; curr != NULL && curr->item != element; curr = curr->next)
在其他情况下 prev != NULL
也需要递减 numberofelements
。
当 curr != NULL
.
时,您可以 "factor out" 来自 if-else 语句的 delete
、numberofelements--;
和 return true;
我会这样写:
bool list::deleteElement(int element)
{
node *curr = head, *prev = NULL;
for (; curr != NULL && curr->item != element; prev = curr, curr = curr->next);
if (curr == NULL) // element not found
return false;
if (prev == NULL)
head = head->next;
else
prev->next = curr->next;
delete curr;
--numberofelements;
return true;
}
我看到的问题:
当 head == NULL
时,您没有 return
语句。那是个问题。这是未定义的行为。
for
循环中的检查curr->item!=element&&curr!=NULL;
不对。当 curr == NULL
时,您将 运行 进入未定义的行为,因为您首先取消对指针的引用,然后检查它是否为 NULL。那应该是 curr != NULL && curr->item != element
.
当 prev != NULL
.
时你没有减少元素的数量
这是更新后的函数:
bool list::deleteElement(int element)
{
node *curr, *prev;
prev = NULL;
if(head==NULL)
{
// Empty list. Return right away with false.
return false;
}
for(curr=head; curr!=NULL && curr->item!=element; curr= curr->next)
{
prev=curr;
}
if(curr!=NULL)
{
// The number of elements needs to be decremented
// regardless of whether prev is NULL or not.
numberofelements--;
if(prev==NULL)
{
head = head->next;
delete curr;
return true;
}
else
{
prev->next = curr ->next;
delete curr;
return true;
}
}
return false;
}//end of function
我正在尝试从链接列表中删除,return true
如果成功删除,return false
如果喜欢的列表中的号码不成功在列表中。问题是如果该项目不在列表中,我不知道如何 return false
。我什至不知道如何检查它是否在列表中。请帮忙。
bool list::deleteElement(int element)
{
node *curr, *prev;
prev = NULL;
if(head!=NULL)
{
for(curr=head; curr->item!=element&&curr!=NULL;curr= curr->next)
{
prev=curr;
}
if(curr!=NULL)
{
if(prev==NULL)
{
head = head->next;
delete curr;
numberofelements--;
return true;
}
else
{
prev->next = curr ->next;
delete curr;
return true;
}
}
return false;
}
}//end of function
您的代码非常接近正确。
您不需要显式检查 head
是否为 NULL。您的逻辑可以隐式处理这种情况。删除该测试后,return false;
将成为函数的最后一行。
您需要在 for 循环中撤销检查,这样您就不会尝试取消引用 NULL 指针:
for (curr = head; curr != NULL && curr->item != element; curr = curr->next)
在其他情况下 prev != NULL
也需要递减 numberofelements
。
当 curr != NULL
.
delete
、numberofelements--;
和 return true;
我会这样写:
bool list::deleteElement(int element)
{
node *curr = head, *prev = NULL;
for (; curr != NULL && curr->item != element; prev = curr, curr = curr->next);
if (curr == NULL) // element not found
return false;
if (prev == NULL)
head = head->next;
else
prev->next = curr->next;
delete curr;
--numberofelements;
return true;
}
我看到的问题:
当
head == NULL
时,您没有return
语句。那是个问题。这是未定义的行为。for
循环中的检查curr->item!=element&&curr!=NULL;
不对。当curr == NULL
时,您将 运行 进入未定义的行为,因为您首先取消对指针的引用,然后检查它是否为 NULL。那应该是curr != NULL && curr->item != element
.当
prev != NULL
. 时你没有减少元素的数量
这是更新后的函数:
bool list::deleteElement(int element)
{
node *curr, *prev;
prev = NULL;
if(head==NULL)
{
// Empty list. Return right away with false.
return false;
}
for(curr=head; curr!=NULL && curr->item!=element; curr= curr->next)
{
prev=curr;
}
if(curr!=NULL)
{
// The number of elements needs to be decremented
// regardless of whether prev is NULL or not.
numberofelements--;
if(prev==NULL)
{
head = head->next;
delete curr;
return true;
}
else
{
prev->next = curr ->next;
delete curr;
return true;
}
}
return false;
}//end of function