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

Xeg*_*ara 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Alo*_*ave 5

while(list->info!=search && list!=NULL)
Run Code Online (Sandbox Code Playgroud)

应该:

while(list!=NULL && list->info!=search) 
Run Code Online (Sandbox Code Playgroud)

这称为短路评估.
当你使用&&第一个表达式时,保证在第二个表达式之前执行内置原语类型[#1].

在你的情况下,解除引用发生在NULL检查之前,所以当list == NULL你,你将最终退化NULL并导致未定义的行为和崩溃.

在sugeested解决方案中:
如果list == NULL那么第二个条件将不会被评估.


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

在评估以下表达式时

a && b
a || b
a ? b : c
a , b
Run Code Online (Sandbox Code Playgroud)

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