2

特定のリンクリストにエンティティが存在するかどうかを確認しようとしています。これは私のコードです:

bool LinkedList::existByID(int ID)
{
//create node to search through the list
Node * helpNode;

//start it at the top of the list
helpNode = head;    

if (head == NULL)
{
    return false;
}


//while the item has not yet been found


while ((helpNode->data->indicatedEntity->getID() != ID)  && (helpNode->data != NULL))
     {

    if (helpNode->data->indicatedEntity->getID() == ID)
    {
        //return true - the data exists
        return true;
    }

    else
        //if the data has not been found, move on
        helpNode=helpNode->next;
     }

//if the data has not been found and the end of the 
//list has been reached, return false - the item does
//not exist
return false;
}

「問題行」としてマークした行から、ifステートメントの部分

(helpNode->data != NULL)

エラー CXX0017 (シンボル "" が見つかりません) およびエラー CXX0030 (式を評価できません) が発生します。

このコードは、リンクリストにエンティティがない場合、つまりヘッドが null の場合に機能します。

Node コンストラクターは次のようになります。

LinkedList::Node::Node()
{  
next=NULL;
data=NULL;
} 

私も次の行で試しました:

(helpNode != NULL)

および Node コンストラクター

LinkedList::Node::Node(){}

すべての組み合わせで同じエラーが返されます。助言がありますか?

4

2 に答える 2

2

まず、コードでいくつか修正することをお勧めします。

ループでは、テストの前にdataのメンバーをチェックして、実際に有効かどうかを確認します。あなたが最後のノードにいると想像してください - そして最後に、次の実行中 - 上部で何がチェックされますか?helpNode helpNode

helpNode=helpNode->next;

第 2 に、 をチェックしhelpNodeたら、次にdataの属性をチェックする前に が有効であることをチェックするdata必要dataがありNULLます。

そして今、あなたのループが何をチェックしているのか考えてみgetID() != IDIDくださいgetID() == ID。それは理にかなっていますか?

dataループ内で次のノードが存在することを確認し、ループ内でID一致することを確認し、true の場合は返すことをお勧めします。

于 2011-05-20T07:26:49.447 に答える
0

まあライン

while ((helpNode->data->indicatedEntity->getID() != ID) && (helpNode->data != NULL))

データが NULL の場合、NULL->indicatedEntity にアクセスしようとするため、問題になる可能性があります。

さらに、indicatedEntity が NULL の場合、NULL->getID() にアクセスしようとしています。

に書き換えることができます

while (helpNode->data != NULL && helpNode->data->indicatedEntity != NULL && helpNode->data->indicatedEntity->getID() != ID)

これは見栄えがよくありませんが、ポインターにアクセスする前に、ポインターが null でないことを確認します。

于 2011-05-20T07:28:02.677 に答える