【问题标题】:Return a node class返回一个节点类
【发布时间】:2012-03-18 05:58:21
【问题描述】:

我的教授要求我们从头开始重新实现所有 LinkedList 函数。不过既然是初级班,他就做了一些规定。以下是完整的作业:

“对于列表,您必须实现除 get_allocator 之外的所有内容。对于所有以“迭代器”作为参数的函数,改为接受节点类。对于所有返回迭代器的函数,改为返回节点。”

由于 LinkedList 使用指针,我不确定如何在不返回指针的情况下返回节点。返回由称为 *current 的指针指向的节点的语法是什么?

我也不确定如何格式化函数。例如,将以下函数更改为接受节点类然后返回节点的语法是什么(我不需要函数的代码,只需要如何接受节点并返回节点类):

iterator insert (iterator position, const int&x)

【问题讨论】:

  • 请重新标记为“家庭作业”以获得适当的帮助。

标签: c++ class return


【解决方案1】:

“对于列表,你必须实现除get_allocator之外的所有东西。对于所有 将“迭代器”作为参数的函数,而不是接受 节点类。对于所有返回迭代器的函数,返回一个节点 而是。”

由于 LinkedList 使用指针,我不确定如何返回节点 不只是返回一个指针。什么是语法 返回一个名为 *current? 的指针指向的节点?

我认为您的教授正在谈论接受和返回指向节点的指针(或引用),而不是节点值(复制节点)。我可以肯定地说,因为这是通过迭代器到节点(节点指针)的一对一转换来保留 std::list 的底层语义的唯一方法。

但是,如果您的节点只是本身存储指针的聚合体并且不尝试进行任何内存管理,那么您可以将它们复制过来,但如果有疑问,我会使用指针。

所以,是这样的:

iterator insert(iterator position, const T& val)
{
   ...
}

你的练习作业应该是这样的:

LinkedListNode* insert(LinkedListNode* position, const T& val)
{
   ...
}

如果您不使用模板并且可以将其设为整数列表或其他任何内容:

LinkedListNode* insert(LinkedListNode* position, int val)
{
   ...
}

希望以后您的教授会让您欣赏基于迭代器的版本的强大功能,因为它们允许您编写函数模板,这些模板不仅适用于链表,而且适用于任何类型的序列。

【讨论】:

  • 谢谢,这很有帮助。但是,我在尝试创建 end() 函数时遇到了问题。由于 end() 应该在结束后返回一个迭代器,我怎么能用指针来做到这一点?我试过让函数返回NULL。但是当我使用插入函数并尝试检查位置是否等于 NULL 时,它说它不是。我不确定如何处理。
  • 你知道如何使用调试器吗?它会极大地帮助你。您可以单步执行所有代码并查看发生了什么。恐怕你在这里给我的细节不足以让我给出足够的答案。如果您的 end 方法返回 NULL 并且您将 end() 传递给 insert,那么它肯定是 NULL,除非出现严重错误。也只是一个侧面,但为了更好地概括您的代码,我建议检查 if position == end() 而不是 position == NULL() 以插入到列表的末尾。
【解决方案2】:

取消引用指针,请使用* 运算符。例如,如果您有一个指向int 的有效指针,并且您希望使用它指向的int 进行访问:

*pointer_to_int = 5;
j = *pointer_to_int / 3;

等等。类似地,如果你想将指向int 的值传递给一个函数,

k = SomeFunction(*pointer_to_int, 12, foo);

或从函数中返回:

int Function() {
    return *pointer_to_int;
}

您可以在任何可能使用variable 的地方使用语法*pointer

声明返回类型的函数的语法不会根据类型而改变。假设你有一些函数返回 int:

int MyFunction() { return my_int; }

或者,如果它返回一个迭代器:

iterator MyFunction() { return my_iterator; }

或者,如果它返回一个苹果:

Apple MyFunction() { return my_apple; }

你看,你只需要用你返回的任何类型替换返回类型的名称。

希望您现在可以看到如何声明一个返回node 对象的函数,以及如何返回node 对象,假设您只有一个pointer_to_node

【讨论】:

    【解决方案3】:

    我认为你不应该使用指针。尝试使用引用或迭代器?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2012-07-26
      • 1970-01-01
      • 2019-11-12
      • 2017-11-03
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多