1

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

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

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

4

3 回答 3

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

应该:

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

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

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

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


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

在以下表达式的评估中

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

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

于 2012-04-05T08:52:14.820 回答
2

您没有检查list此处的有效性:

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

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

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

于 2012-04-05T08:52:45.540 回答
1

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

于 2012-04-05T08:53:54.960 回答