Как работает эта поп-функция?

0

Я хотел бы понять следующую 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 но почему?

  • 0
    В pop () должен быть код, чтобы проверить, если top_node! = 0, прежде чем использовать top_node-> next.
Теги:
linked-list

1 ответ

3
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;
}
  • 0
    Стоит отметить, что проверка на nullptr была бы разумной.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню