如果要删除的项目不在列表中,如何返回"false"

How to return `false` if item you want to delete isn't in list

本文关键字:何返回 返回 false 删除 项目 列表 如果      更新时间:2023-10-16

我正在尝试从链接列表中删除,如果成功删除,则返回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语句中"剔除"deletenumberofelements--;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;
}

我看到的问题:

  1. head == NULL时,您没有return语句。这是个问题。这是未定义的行为。

  2. for循环中的检查curr->item!=element&&curr!=NULL;不正确。当curr == NULL时,您将遇到未定义的行为,因为您首先取消引用指针,然后检查它是否为NULL。应该是curr != NULL && curr->item != element

  3. 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