如果要删除的项目不在列表中,如何 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 语句的 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.

  4. 时你没有减少元素的数量

这是更新后的函数:

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