【问题标题】:Search function - Linked List [closed]搜索功能 - 链表[关闭]
【发布时间】:2016-01-26 01:56:18
【问题描述】:

我正在开发一个搜索功能来搜索链接列表中的特定值。当它找到该值时,我想输出它的位置。我似乎无法通过第一个节点而不会出错。我认为循环有问题,但我不确定是什么。

int NumberList::search(double num)
{
    ListNode *nodePtr;
    nodePtr=head;
    int i=0;
    while (nodePtr->value!= NULL)
    {
        i=i+1;
        if (nodePtr->value==num)
            return i;
        else
            nodePtr=nodePtr->next;
    }
    return 0;  
}

【问题讨论】:

标签: c++ list function search


【解决方案1】:

您的 while 循环不正确。您应该测试 nodePtr 不是 NULL

while (nodePtr != NULL)
{
    i = i + 1;
    if (nodePtr->value == num)
        return i;
    else
        nodePtr = nodePtr->next;
}

这也是在处理指针时使用nullptr 而不是NULL 的完美理由。如果你使用过nullptr,那么

while (nodePtr->value!= nullptr)

会出现编译器错误,因为您无法将 doublenullptr 进行比较

【讨论】:

  • nodePtr 可能是一个哨兵节点,其中 nodePtr->value == NULL
  • 谢谢!!这有帮助!我必须在课堂上解决这个问题和其他问题。
  • @DieterLücking 是的,但由于 OP 将 valuenum 进行比较,我假设 value 是非指针类型。
【解决方案2】:

您的 while 循环条件应该是:

while (nodePtr != NULL)

由于这个错误,您很可能正在访问一个指针为 NULL 的节点,并且通过取消引用它会导致 未定义的行为

【讨论】:

    【解决方案3】:

    您没有显示ListNode 类型,但我猜valuedouble

    while (nodePtr->value != NULL)

    您在这里检查double 是否不是NULLNULL 本质上是0)。但是您需要针对NULL 测试nodePtr

    注意:考虑使用nullptr 而不是NULLnullptr 是空指针的类型安全值,会产生编译错误。

    错误:“double”和“std::nullptr_t”类型的无效操作数到二进制“operator==”

    【讨论】:

      【解决方案4】:

      我不知道相应的类是如何定义的,但我认为无论如何该函数应该如下所示

      int NumberList::search(double num)
      {
          ListNode *nodePtr = head;
          int i = 0;
      
          while ( nodePtr != NULL && nodePtr->value != num )
          {
              ++i;
              nodePtr = nodePtr->next
          }
      
          return nodePtr != NULL ? ++i : 0;
      }
      

      很难准确比较两个浮点数。您应该使用一种比较方法,例如考虑到一个 epsilon。

      还要考虑到其他函数,例如将节点添加到列表的函数也可能是错误的。:)

      【讨论】:

      • 提示#1:numdouble。提示#2:比较浮点数...
      • @АндрейБеньковский 我附加了我的帖子。