Я хотел бы понять следующую pop-функцию.
struct list_node{
int key;
list_node* next;
list_node(int k, list_node* n)
: key(k), next(n);
{}
};
class stapel{
private: list_node* top_node;
public: void pop (int value);
};
void stapel::pop()
{
list_node* p=top_node;
top_node=top_node -> next;
delete p;
}
Я знаю, что pop-функция удаляет самый верхний узел стека. Таким образом, у вас есть указатель p
, который указывает на тот же узел, что и указатель top_node
. Мне трудно понять следующую строку. top_node->next
означает то же самое (*top_node).next
и top_node
имеют тип list_node
, который похож на поле, состоящее из ключа, следующего указателя и их значений. Теперь я не могу понять, что top_node->next
самом деле означает. Я знаю, что следующий станет следующим указателем top_node
но почему?
void stapel::pop()
{
list_node* p = top_node; // Get pointer to top of stack
top_node = top_node->next; // Find the next item in the stack, assign it to now be the top
delete p; // Delete the current top
}
Вы в основном сказали стеку, что новый "топ" - это узел, который раньше был вторым. Затем вы удаляете верхний узел.
То, как работает next
строка, аналогично тому, как работает "связанный список". Когда вы создаете стек (или связанный список), для каждого узла вы назначаете значение этого узла (key
) и указатель на следующий узел (next
).
top_node = top_node->next;
просто получает next
переменную-член текущего узла. Эта переменная-член является указателем на следующий узел, который был назначен, когда текущий узел был вставлен в стек.
редактировать
Как было отмечено @Edward, также было бы хорошей идеей, чтобы проверить, что top_node
не nullptr
. Если бы это было так, вы попали бы в исключение, когда пытались получить доступ к next
члену. Таким образом, вы можете изменить эту функцию следующим образом:
void stapel::pop()
{
if (top_node == nullptr)
return;
list_node* p = top_node;
top_node = top_node->next;
delete p;
}
nullptr
была бы разумной.