2015-10-26 74 views
-2

我正在使用搜索功能来搜索特定值的链接列表。当它发现我想要输出其位置的价值时。我似乎无法通过第一个节点没有得到一个错误。我认为循环有问题,但我不确定是什么。搜索功能 - 链接列表

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; 
} 
+3

如果什么'nodePtr'是'NULL'? –

+1

你应该说你正在得到什么错误 – pm100

+1

请在这里请求这种错误诊断时发布一个[MCVE]。否则你的问题是脱离主题。 –

回答

1

您的while循环不合适。您应该测试的是nodePtrNULL

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

而且这与指针打交道时使用nullptr而不是NULL一个完美的理由。如果你有使用nullptr然后

while (nodePtr->value!= nullptr) 

会给你一个编译器错误,因为你不能比较一个doublenullptr

+0

nodePtr可能是一个哨兵节点,其中nodePtr-> value == NULL –

+0

谢谢!这有帮助!我不得不在我的班级中解决这个问题。 –

+0

@DieterLücking是的,但由于OP正在将'value'与'num'进行比较,我假设'value'是一个非指针类型。 – NathanOliver

0

while循环条件应该是:

while (nodePtr != NULL) 

因为这个错误,你的很可能访问节点谁的指针是NULL而通过取消引用此引起的未定义的行为

0

您不显示ListNode类型,但我猜valuedouble

while (nodePtr->value != NULL)

在这里,我们检查,如果doubleNULLNULL基本上是0)。但是您需要针对NULL测试nodePtr

注:考虑使用的nullptr代替NULLnullptr是一个空指针的类型安全值,将产生一个编译错误。

error: invalid operands of types 'double' and 'std::nullptr_t' to binary 'operator=='

1

我不知道对应的类是如何定义的,但我认为,在任何情况下,函数应该看看下面的方式

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。

也考虑到其他功能,例如,增加了节点列表中的功能也可以是错误的。:)

+0

提示#1:'num'是'double'。提示#2:比较浮点数... –

+0

@ AndreyBenkovsky我附加了我的文章。 –