【问题标题】:What is a Cursor Linked List? [C++]什么是游标链表? [C++]
【发布时间】:2010-04-07 01:53:24
【问题描述】:

我的教授向我提供了一个名为 CursorList.cpp 的文件,该文件实现了“光标链接列表”。问题是 - 我什至不知道那是什么!

谁能告诉我它的要点?

谢谢!

【问题讨论】:

  • yuval,您应该首先查看文件公开的接口。也就是说,阅读它,看看有哪些公共方法,如何使用它们等等。从名字上看,它似乎很确定它实现了一个链表数据结构,即一个可以让你进行插入、删除、遍历的数据结构, 之类的东西。测试一下。

标签: c++ data-structures linked-list


【解决方案1】:

CursorList 是链表的数组版本。本质上,您有一个列表节点数组,但不是每个节点都包含指向链表中下一项的指针,而是数组中的每个节点元素都包含下一个节点元素的索引。例如,如果我们想将5, 3, 2, 11, 9 存储在一个链表中,我们将拥有5 -> 3 -> 2 -> 11 -> 9 -> NULL。插入不是问题,因为我们只需将最后一个指针更改为指向插入的节点并将插入的节点指向NULL。删除也是一样,我们只是重新调整指针。但是,必须始终为新节点动态分配(使用 malloc 或 new)内存可能是有问题的。

如果我们要存储在 CursorList 中,我们首先声明数组的最大大小,然后填充它。所以我们说listNode cursorList[10],我们声明一个listNode对象如下:

class listNode {
    public:
        listNode() {
            data = -1;
            next = NULL;
        }
        listNode(int inputData, &listNode inputNext) {
            data = inputData;
            next = inputNext;
        }
    private:
        int data;
        listNode* next;
};

所以在用 listNode 对象填充数组后,我们将得到如下所示的内容:

现在,如果我们想删除 5,我们所要做的就是更新 next 索引。所以我们只剩下这个:

出现了一个问题,我们如何知道将 5 的next 索引设置为什么?好吧,这就是 Freelist(在@Justin Ethier 的回复中提到)的用武之地。 Freelist 包含数组中仍然空闲的索引。所以在创建 CursorList 时,Freelist 有 0-9。当 listNode 对象被分配给数组的元素时,Freelist 会删除这些索引。当一个数字被删除时(例如上面带有 5 的示例),索引被添加回 Freelist。如果我们想向 CursorList 添加一个数字,我们只需更新适当元素的 next 索引。

【讨论】:

    【解决方案2】:

    根据this,这里是游标链表的一些背景:

    • 某些语言不支持指针
    • 改用对象数组
    • 从 Freelist 开始
    • 在需要时从 Freelist 分配空间
    • 删除:更改指针,添加到 Freelist

    所以基本上是一个不使用指针实现的链表。也许这个实现应该“更容易”理解?

    【讨论】:

    • 仍然不是很清楚它们是什么。那么我可以扩展我的问题并询问在这种情况下使用的列表是什么吗?谢谢!
    【解决方案3】:

    我的猜测是linked list 还保留了一个指向“当前”元素的指针,例如用于迭代列表。

    如果您想确定教授的确切含义,请查看 .cpp 文件并找出其中实现的内容。

    【讨论】:

    • 这与我对这个 ADT^H^H^H 对象类型的回忆一致——列表 + 一个当前位置——回到我的数据结构类(80 年代,唉)之前,这个词是“被盗”表示(仅)和 SQL 结果集缓冲区
    【解决方案4】:

    在游标实现中,我们构建存储 汇集我们自己,将我们未使用的节点存储在一个 链表存储在数组中。

    在 C 和 C++ 中,存储池由一组管理 语言提供的库函数。 在执行开始时,有一个适当大的存储池 从操作系统中获取。 当程序请求一个新节点时,存储是从 由语言库函数池化。 如果池中可用的存储空间不足,则库请求 来自操作系统的额外池空间。 当存储被程序释放时,语言库函数 将其返回到存储池。 游标实现通常会获得一个固定的 来自系统的存储量作为阵列,以及 提供类似于 new 和 delete 的功能 使用的应用程序

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2011-06-25
      • 2012-09-08
      • 2011-05-12
      相关资源
      最近更新 更多