链表中的线性搜索[语言:C ++编译器:Dev-Cpp 4.9.9.2]

时间:2012-04-05 08:50:19

标签: c++

我遇到了问题,似乎无法找到解决方案..

int linearSearch(nodeptr list,char search){
    int pos =0;
    if(list==NULL)
        return -1;
    while(list->info!=search && list!=NULL){
        pos++;
        list=list->next;
    }
    if(list==NULL)
        return -1;
    else
        return pos;
}

我总是遇到运行时错误.. :(

3 个答案:

答案 0 :(得分:5)

while(list->info!=search && list!=NULL)

应该是:

while(list!=NULL && list->info!=search) 

这称为 Short-circuit evaluation
当您使用&&时,第一个表达式保证在内置基元类型的第二个之前执行 [#1]

在您的情况下,取消引用会在NULL检查之前发生,因此,当list == NULL时,您最终会取消归档NULL并导致未定义的行为,崩溃。

在sugeested解决方案中:
如果list == NULL则不会评估第二个条件。


参考:
[#1] C ++ 03标准1.9.18:

  

评估以下表达式

a && b
a || b
a ? b : c
a , b
     

使用这些表达式中运算符的内置含义,在评估第一个表达式(12)之后有一个序列点。

答案 1 :(得分:2)

您未在此处检查list的有效性:

while(list->info!=search && list!=NULL)

尝试在list!=NULL之前检查list->info

另外,请使用名称list,它是标准库容器的名称。

答案 2 :(得分:1)

&&条件按照指定的顺序进行评估,因此在下一次迭代中list在循环中变为NULL时,您首先尝试{{1}导致访问冲突。您需要将条件反转为list->info != search