2012-02-20 2 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; 
} 
Смежные вопросы