2012-02-20 4 views
-1

노드 (중복 연결됨)와 해당 구성 요소를 추가, 삭제 및 표시하는 프로그램을 작성하고 있지만 노드를 검색하고 해당 구성 요소를 표시하려고 할 때마다이 오류가 발생합니다. C++ 연결된 목록 검색 오류 : STATUS_ACCESS_VIOLATION

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

2875

[주]는 4640 open_stackdumpfile : 덤프 스택 추적 내가 있는지를 검색하도록되어 내 .H 파일 내에서 검색 기능으로 좁혀

a.exe.stackdump하기 검색된 계좌 번호가 링크 된 목록 내에있는 노드가 있습니다. 이 함수는 앞에 오는 노드 또는 "이전"노드를 반환합니다.

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