如果要删除的项目不在列表中,如何返回"false"
How to return `false` if item you want to delete isn't in list
我正在尝试从链接列表中删除,如果成功删除,则返回true
;如果点赞列表中的数字不在列表中,则返回false
。问题是,如果该项目不在列表中,我不知道如何返回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
时,您可以从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
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?
- 奇怪的行为当我们在返回返回返回时,奇怪的行为
- 返回返回基本或派生CLSS指针的功能值
- 用于检查使用大数字 C++ 时返回返回 0 的最大素因数的函数
- 函数不会返回返回c 的内容
- 使用 system() 执行命令返回返回值的 256 倍 ( << 8).这有什么意义
- C++函数,不返回返回数据
- 隐式返回返回类型变量