In
while (temp2->getNext() != NULL || temp2->getData() != value)
{
temp2 = temp2->getNext();
}
temp2->getNext() != NULL
будет иметь значение NULL для последнего элемента в списке, и данные в последнем элементе в списке могут не соответствовать значению.В этом случае
while (NULL != NULL || "I" != "love") // false or true = true. Enter loop
{
temp2 = NULL;
}
Следующая итерация заканчивается неудачей, потому что
while (NULL->getNext() != NULL || temp2->getData() != value)
{
temp2 = temp2->getNext();
}
Ка-блам.
Мое решение сильно меняет код.Тебе это может не понравиться.Также обратите внимание, что я удалил все, что не будет компилироваться, потому что это было исключено.
class node
{
friend class list; // list has access to node's private members
public:
node(string value)
{
next = NULL;
data = value;
}
// removed setNext. Only list should ever be allowed to set the next member
void setdata(string value) {
data = value;
}
// same deal for get. Some shmuck could delete link->getNext();, so why let them?
string getData()
{
return data;
}
private:
node *next;
string data;
};
Это гораздо более безопасный узел списка.Все, с чем пользователь может взаимодействовать, это данные.Остальные надежно заблокированы и доступны только для list
.
class list
{
public:
list()
{
head = NULL;
}
void insertAtEnd(string);
private:
node *head;
};
Без изменений, кроме удаленного материала, поскольку он поддерживает код, не включенный в вопрос.
void list::insertAtEnd(string value)
{ //main func being used
node **cur = &head; // double pointer abstracts away need to test for head.
// Now all nodes are equal and we're always pointed at a next.
while (*cur != NULL && (*cur)->getData() != value) // note && not ||
//we loop until out of nodes unless we find a match
{
cur = &(*cur)->next; // get pointer to next next
}
if (*cur != NULL) // pointing at a node. Must have exited because of match
{
// did stuff I ommtted because no MCVE
}
else // not pointing at node. Need a new node.
{
*cur = new node(value);
}
}
Кровавая баня,Вместо того, чтобы бросать большой шар объяснений, я прокомментировал, что я делал и почему.