Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果要删除isn';列表中的t_C++_Linked List_Return - Fatal编程技术网

C++ 如果要删除isn';列表中的t

C++ 如果要删除isn';列表中的t,c++,linked-list,return,C++,Linked List,Return,我正在尝试从链接列表中删除,如果成功删除,则返回true,如果喜欢列表中的数字不在列表中,则返回false。问题是,如果项目不在列表中,我不知道如何返回false。我甚至不知道如何检查它是否在列表中。请帮忙 bool list::deleteElement(int element) { node *curr, *prev; prev = NULL; if(head!=NULL) { for(curr=head; curr->item!=element&a

我正在尝试从链接列表中删除,如果成功删除,则返回
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。您的逻辑可以隐式地处理该情况。一旦消除了该测试,
将返回false将是函数的最后一行

您需要在for循环中反转检查,以便不尝试取消对空指针的引用:

for (curr = head; curr != NULL && curr->item != element; curr = curr->next)
prev!=也为空

您可以“计算”出
删除
,以及
numberofelements--
返回truecurr!=空

我会这样写:

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
    语句。这是个问题。这是未定义的行为

  • 检查
    curr->item=元素(&curr)=无效for
    循环中的code>不正确。当
    curr==NULL
    时,您将遇到未定义的行为,因为您首先取消引用指针,然后检查它是否为NULL。那应该是
    curr!=空(&curr->item!=元素

  • prev!=空

  • 以下是更新后的函数:

    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