【问题标题】:Returning true if successful in deleting the node in C++如果在 C++ 中成功删除节点,则返回 true
【发布时间】:2018-09-24 06:00:27
【问题描述】:

我有一个任务,我必须在链表末尾(尾部之前的那个)找到节点并将其返回并删除。如果成功删除,我返回true,所以它基本上是一个bool函数。

到目前为止,我不知道我做错了什么。

我无法返回值,因为我不知道如何同时返回 true 和 bool 函数的值。

这里是代码;

bool List::getBack(int & key)
{
    Node *temp = new Node;
    Node *prev = new Node;
    temp = head;
    if (tail==head)
    {
        return false;
    }
    else {
        while (temp->next != nullptr)
        {
            prev = temp;
            temp = temp->next;
        }
        tail = prev;
        prev->next = nullptr;
        delete temp;
        return true;
    }
}

我不希望任何人解决我的问题,我只需要帮助理解它。

总的来说,这就是使用这个函数应该发生的事情:

while (MyList.getBack(i))
    cout << i << " ";
cout << endl << endl;

【问题讨论】:

  • 您还记得使用= 赋值和使用== 比较相等之间的区别吗?
  • 啊,是的,你说得对!在 if 语句中,我忘记了另一个等号。谢谢!
  • 嘿,不,我很确定这不是问题所在。我会打出一个更清楚的问题,谢谢你提醒我:)
  • key 是干什么用的?你传入一个非const 引用,表明你想更新它,但你从来没有给它分配任何东西。这不是你想要的“其他返回值”吗?
  • 是的,那是真的,这就是为什么我对在其 bool 函数时如何准确返回键的值感到有点困惑。

标签: c++ c++11 linked-list


【解决方案1】:

您有很多可能性来实现这一点。如果您严格地想要返回几个东西,在您的情况下(intbool),您可以返回一个包含两个值的结构或元组。

另一种可能性是获取指向int 的指针并返回bool,或者获取指向bool 的指针并返回int,并获取指向boolint 的指针并且不返回任何内容(void),或指向包含intbool 的结构的指针。

struct ComplexResult
{
    int IntegerValue;
    bool IsSomethingTrue;
}

TRICK:有一个技巧你想有点创意:对于bool,一个比特就足以编码真|假,因此你可以把真假放在符号中int 的一部分。因此,您可以只返回 int 并返回 unsigned intbool(与使用 uint 一样,您只有更少的值)。

【讨论】:

  • 谢谢! :) 我认为将指针指向 int 并返回 bool 是我在此作业中的情况的解决方案。
  • 在这个线程中没有一个函数接受一个指向int的指针,只有一个引用。
【解决方案2】:

你的实现全错了。

一方面,你是 new'ing 临时的 Node 对象,你根本不应该分配它们,而且你正在泄漏它们。

而且,您实际上并没有输出您删除的 Node 的值。

而且,您的整个函数可以变得更加简单,因为您根本不需要枚举整个列表。您已经知道列表中的最后一个Node,因为您有一个直接指向它的tail 指针,因此使用该指针直接访问最后一个Node(您不应该为@987654327 使用非空哨兵@ - 如果你是,你会让自己变得更难)。

试试这个:

bool List::getBack(int & key)
{
    if (!tail)
        return false;

    key = tail->key; // or whatever the actual field name is ...

    Node *temp = tail;

    tail = tail->prev;
    if (tail)
        tail->next = nullptr;
    else
        head = nullptr;

    delete temp;

    return true;
}

【讨论】:

  • 谢谢!我会比较我所做的一切错误:)
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多