Рассмотрим следующий фрагмент кода:
void List::insertFront(int key)
{
Node *tmp_node = new Node;
tmp_node->key = key;
tmp_node->next = head->next;
tmp_node->prev = head;
head->next = tmp_node;
_size++;
}
Эта функция добавляет элемент в начало списка, и я хочу поймать первый элемент списка в другой функции и удалить его. Для этого я написал следующий фрагмент кода:
bool List::getFront(int &key)
{
if (head->next->key == key)
{
Node *tmp_node = new Node;
head->next = tmp_node->next;
delete tmp_node;
delete head->next;
_size--;
return true;
}
else return false;
}
Как вы можете видеть каждый раз, когда я создаю новый узел, который использует свежий пустой список, но я хочу использовать список, созданный в предыдущей функции.
Как я могу передать узел с insertFront()
на getFront()
?
Первым узлом списка является head->next
.
этот вопрос довольно неясен. знаете ли вы, что insertFront
и getFront
являются методами класса и что у вас есть доступ к членам этого класса? вы знаете, как вернуть значение из функции?
Почему getFront
вообще создает новый Node
? В этом нет никакого смысла.
getFront
просто удаляет узел из списка [при совпадении], но он удаляется. Это полезно? Будет ли лучше возвращать согласованный узел (например, Node * List::getFront(int &key)
и просто делать: if (head->next->key == key) { Node *tmp = head->next; head->next = tmp->next; _size--; return tmp; } else return NULL;
Кроме того, не следует ли вам проверять head->next
на ненулевое значение перед выполнением head->next->key
?
Переосмыслить название getFront
. Даже после того, как вы исправите сломанную логику, чтобы не удалять список, он не получит узел.
«getFront
просто удаляет узел из списка» - нет, не работает. Если это ваше намерение, то код на самом деле делает это не так.
Ваш код getFront()
неверен. Вместо этого вам нужно что-то вроде этого:
bool List::popFrontIfMatches(int key)
{
Node *tmp_node = head->next;
if ((tmp_node) && (tmp_node->key == key))
{
if (tmp_node->next)
tmp_node->next->prev = tmp_node->prev;
if (tmp_node->prev)
tmp_node->prev->next = tmp_node->next;
head->next = tmp_node->next;
delete tmp_node;
_size--;
return true;
}
else
return false;
}
При этом, почему вы рассматриваете head->next
как 1-й узел в списке, а не сам head
, как это обычно принято?
void List::insertFront(int key)
{
Node *tmp_node = new Node;
tmp_node->key = key;
tmp_node->next = head;
tmp_node->prev = NULL;
head = tmp_node;
_size++;
}
bool List::popFrontIfMatches(int key)
{
Node *tmp_node = head;
if ((tmp_node) && (tmp_node->key == key))
{
if (tmp_node->next)
tmp_node->next->prev = tmp_node->prev;
if (tmp_node->prev)
tmp_node->prev->next = tmp_node->next;
head = tmp_node->next;
delete tmp_node;
_size--;
return true;
}
else
return false;
}
insertFront()
должен обновитьhead
. Это отправная точка для списка, она будет доступна вgetFront()
.