Ошибка поиска в связанном списке C ++: STATUS_ACCESS_VIOLATION - PullRequest
0 голосов
/ 20 февраля 2012

Я пишу программу, которая добавляет, удаляет и отображает узлы (которые дважды связаны) и их компоненты, но всякий раз, когда я пытаюсь извлечь узел и отобразить его компоненты, я получаю эту ошибку:

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

2875 [main] a 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;

Если бы кто-нибудь вообще мог мне помочь, я был бы благодарен!

1 Ответ

0 голосов
/ 20 февраля 2012

Похоже, ваш список может быть поврежден, или указатель, который вы передаете для получения предыдущего узла, недействителен, поскольку этот код выглядит нормально.Тем не менее, мне кажется, что это можно написать гораздо проще:

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