Как передать указатель от функции void на другой C++

Рассмотрим следующий фрагмент кода:

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()?

insertFront() должен обновить head. Это отправная точка для списка, она будет доступна в getFront().
Yksisarvinen 30.10.2018 23:11

Первым узлом списка является head->next.

stark 30.10.2018 23:12

этот вопрос довольно неясен. знаете ли вы, что insertFront и getFront являются методами класса и что у вас есть доступ к членам этого класса? вы знаете, как вернуть значение из функции?

463035818_is_not_a_number 30.10.2018 23:12

Почему getFront вообще создает новый Node? В этом нет никакого смысла.

David Schwartz 30.10.2018 23:13
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?
Craig Estey 30.10.2018 23:22

Переосмыслить название getFront. Даже после того, как вы исправите сломанную логику, чтобы не удалять список, он не получит узел.

user4581301 30.10.2018 23:25

«getFront просто удаляет узел из списка» - нет, не работает. Если это ваше намерение, то код на самом деле делает это не так.

Remy Lebeau 31.10.2018 01:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
62
1

Ответы 1

Ваш код 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;
}

Другие вопросы по теме