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]
の場合、最初の式 を使用する&&と、2番目の式の前に実行されることが保証されます。

あなたの場合、逆参照はNULLチェックの前に発生します。したがって、list == NULLの場合、逆参照が発生NULLし、未定義動作とクラッシュが発生します。

提案されたソリューションの場合:
その場合list == NULL、2番目の条件は評価されません。


参照:
[#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

また、この名前は使用しlistないでください。これは、標準ライブラリコンテナの名前です。

于 2012-04-05T08:52:45.540 に答える
1

&&条件は指定された順序で評価されるため、次の反復中にループに入ると、最初に実行しようとし、アクセス違反が発生しますlist。条件をに戻す必要があります。NULLlist->info != searchlist != NULL && list->info != search

于 2012-04-05T08:53:54.960 に答える