2012-02-20 10 views
-1

ノード(二重リンクされている)とそのコンポーネントを追加、削除、表示するプログラムを作成していますが、ノードを取得してコンポーネントを表示しようとすると、C++リンクリスト検索エラー:STATUS_ACCESS_VIOLATION

2 [main] a 4640 exception::handle: Exception: STATUS_ACCESS_VIOLATION 

2875 4640 open_stackdumpfile [メイン]:

をa.exe.stackdumpするスタックトレースのダンプ私はどうかを確認するために検索するようになっている私の.hファイル内検索機能に絞られています検索されているアカウント番号がリンクされたリスト内のノードにあります。この関数は、その前に来るノード、または「前の」ノードを返します。

bool searchListByAcctNum (int searchKey, nodePtr *prevOut) 
    { 
     bool found = false; 
     nodePtr p = headNum; 
     nodePtr prev = NULL; 
     while (p != NULL) 
     { 
     if (p->acctNum < searchKey) 
     { 
      prev = p; 
      p = p->nextNum; 
     } 
     else 
     { 
      if (p->acctNum == searchKey) 
       found = true; 
      p = NULL; 
     } 
     } 
     *prevOut = prev; 
     return found; 

誰もがすべてで私を助けることができれば、私はそれを感謝したい:

は、ここに私の検索機能です!

+0

リストを作成するときにどのようにノードにメモリを割り当てていますか? – Naveen

+1

情報が不足しています。 –

+0

リンクされたリストが壊れていて、古いポインタが含まれているか、 'prevOut'が' NULL'(または無効なポインタ)です。 –

答えて

0

リストが壊れているか、前のノードを受け取るために渡しているポインタが無効であるようです。そのコードは大丈夫です。しかし、それはもっと簡単な方法で書くことができると私には思われます。

bool searchListByAcctNum (int searchKey, nodePtr *prevOut) { 
    /// Start at beginning of list, use pointer variable to hold previous. 

    nodePtr p = headNum; 

    *prevOut = = NULL; 

    // Process entire list, will exit early if need be. 

    while (p != NULL) { 
     // If past it, just return false, caller should ignore prevOut. 

     if (p->acctNum > searchKey) 
      return false; 

     // If equal, return true, prevOut holds previous or NULL if found at start. 

     if (p->acctNum == searchKey) { 
      return true; 

     // Save previous and advance to next. 

     *prevOut = p; 
     p = p->next; 
    } 

    // Reached end of list without finding, caller should ignore prevOut. 

    return false; 
} 
関連する問題