C ++ Linkedlist простой вопрос - PullRequest
2 голосов
/ 20 мая 2011

Я пытаюсь проверить, существует ли сущность в данном связанном списке. Это мой код:

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 (выражение не может быть оценено).

Этот код работает, если в связанном списке нет сущностей - другими словами, если заголовок равен нулю.

Конструктор Node выглядит следующим образом:

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

Я тоже пробовал это с линией:

(helpNode != NULL)

и конструктор Node

LinkedList::Node::Node(){}

Все комбинации возвращают одинаковые ошибки. Есть предложения?

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Во-первых, я рекомендую исправить некоторые вещи с помощью вашего кода.

В своем цикле вы проверяете data член helpNode перед тестированием, чтобы увидеть, действительно ли helpNodeдействительный.Представьте, что вы находитесь на последнем узле - и в конце, пока выполняется следующее - что теперь проверяется вверху?

helpNode=helpNode->next;

Во-вторых, как только вы проверили на helpNode, следующийперед проверкой атрибутов data следует проверить, действительно ли data, что если data равно NULL?

А теперь подумайте о том, что проверяет ваш цикл, он проверяет, что getID() != ID, иа внутри цикла вы тестируете на ID, getID() == ID?имеет ли это смысл?

Я рекомендую, чтобы в вашем цикле вы просто проверяли наличие следующего узла и data, а затем в цикле проверяли, что ID совпадает, и возвращаете, если true.

0 голосов
/ 20 мая 2011

Ну линия

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

может быть проблемой, если данные равны NULL, потому что тогда вы будете пытаться получить доступ к NULL-> указаноEntity

далее, если указано, что Entity равен NULL, то вы пытаетесь получить доступ к NULL-> getID ()

Вы можете переписать его на

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

, который выглядит не очень хорошо, но он гарантирует, что ваши указатели не равны нулю, прежде чем пытаться получить к ним доступ.

...