2011-04-30 10 views
0

リンクリストで検索するコードはここにありますが、正しい結果が得られません。私を助けてください、私はそれについて非常に心配しています。リンクリストで検索する

search() { 

    char ser[20]; 
    cout << "enter data to be searched" << endl; 
    gets(ser); 

    for (start=head; start->ptr!=NULL; start=start->ptr) { 
    if (start->info == ser) { 
     cout << "ok" << endl; 
     break; 
    } 
    } 
    cout << "not found" << endl; 
} 

おかげで、 Saima Kanwal Bhutta

答えて

1

あなたはこれを行うには何を期待していますか?

if (start->info == ser) { 

それはser配列の先頭にstart->infoかのポイントをチェックしています。文字列を比較するには、おそらくstrcmpを使用します。

0

2つの文字列を比較するには、strcmp()を使用します。 "=="を使用すると、文字列の内容ではなく2つのポインタが比較されます。

0

あなたの場合、文字列の開始アドレスの代わりに文字列の内容を比較する必要があります。

正しいバージョン

void search() { 

    char ser[20]; 
    cout << "enter data to be searched" << endl; 
    gets(ser); 

    for (start=head; start->ptr!=NULL; start=start->ptr) 
    { 
    if (strcmp(start->info, ser) == 0) 
    { 
     cout << "found" << endl; 
     return; 
    } 
    } 
    cout << "not found" << endl; 
} 

もう少しあなたがforループの前に最初のheadを確認し必要

を言及します。それ以外の場合、headがNULLの場合、プログラムはクラッシュします。

+0

gets()が正しいと言うことは難しいです。 –

0

ループ状態は危険です。 'start'自体がNULLかどうかはチェックしていません。さらに、Next要素が使用可能かどうかを比較しているため、次の要素が使用できない場合は現在の要素が失われます。文字列の比較も正しくありません。あなたのループは次のように更新します。

for (start=head; start != NULL; start=start->ptr) { 
     if (strcmp(start->info, ser) == 0) { 
      cout << "ok" << endl; 
      break; 
     } 
     } 
1

Saima、まず

は、フォーラムへようこそ、また、コンピュータプログラミングの、素晴らしいイライラ、そして実りの世界を歓迎します。

第2に、あなたの投稿を編集しました。 editボタンをクリックすると、ソースコードのレイアウト方法がわかるので、フォーラムでうまく表示されます。

第3に、あなたがbreakと言ったところでreturnを意味していたと思うので、「見つからない」というメッセージが表示されることはありません。それはあなたが望んだことですか?

第4に、ユーザーが入力した部分をリスト検索部分から分離することをお勧めします。これは簡単に行えます。リンクされたリスト検索は、ユーザーは今すぐ入力します。同様に、検索からの出力を分離して、後で検索を再利用して、状況に適した出力を生成することができます。

最後に、これらの変数名(私を許して)吸う!

だから... ...私のANSI-Cのバージョンは、次のようになります。

int contains(char* target) { 
    for (Node node=head; node->next!=NULL; node=node->next) { 
    if (strcmp(node->data, target)==0) { 
     return 0; // TRUE 
    } 
    } 
    return 1; // FALSE 
} 

上記はずっとそのコードを作るのに役立ちリンクリストの部品のための「かなり標準的な」名前ですより読みやすく、保守的です。また、WTFは "ser"です...どのように "ターゲット"について?

これがあなたの頭の中にあるならば、それについて心配しないでください...ちょうどこのアドバイスを無視してください。

乾杯。キース。

+1

なぜ真に0、偽に1を使用していますか? –

0

バッファの長さを指定する方法がないため、危険です。 char配列で使用する選択肢がありますが、std :: stringを使う方が簡単です。 find関数を別の関数に抽出しました。これにより、検索する方法や検索方法に関係なく、同じ機能を使用してリストを検索することができます。

Node* find(Node* head, const string& needle) { 
    for (; head; head = head->ptr) { 
     if (head->info == needle) { 
      return head; 
     } 
    } 
    return 0; 
} 

void search(Node* head) { 
    string needle; 
    cout << "Data to be searched: "; 
    if (!getline(cin, needle)) { 
     // Do something appropriate, such as throw an exception, return 
     // an error code (if you change the function's interface), or 
     // simply exit. 
     abort(); 
    } 

    Node* found = find(head, needle); 
    if (found) { 
     cout << "Found.\n"; 
    } 
    else { 
     cout << "Not found.\n"; 
    } 
} 
関連する問題