【问题标题】:How to pass a pointer from a void function to another C++如何将指针从 void 函数传递到另一个 C++
【发布时间】:2018-10-30 22:08:29
【问题描述】:

考虑以下代码:

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() 访问
  • 列表的第一个节点似乎是head->next
  • 这个问题不太清楚。你知道insertFrontgetFront 是类方法并且你可以访问类的成员吗?你知道如何从函数中返回值吗?
  • 为什么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->key 之前你不应该检查head->next 的非空值吗?

标签: c++ visual-studio pointers


【解决方案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 视为列表中的第一个节点,而不是像通常的做法那样将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;
}

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2017-07-23
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多