是否可以使用指针链接列表实现?

21 c++ pointers linked-list

我的问题很简单,可以使用C++,实现链接列表数据结构而不使用指针(下一个节点)吗?为了进一步限定我的问题,我的意思是可以只使用类实例创建一个Linked-List数据结构.

常见的节点定义可能如下:

template<typename T>
struct node
{
   T t;
   node<T>* next;
   node<T>* prev;
};
Run Code Online (Sandbox Code Playgroud)

我知道std::list等等,我只是想知道它是否可能 - 如果是这样的话怎么样?代码示例将不胜感激.

更多说明:

  1. 插入应为O(1).
  2. 遍历不应超过O(n).
  3. 真实节点和空节点应该是可区分的.
  4. 链表的大小应仅受可用内存量的限制.

Jer*_*ner 17

当然,如果您不介意链接列表具有最大大小,您可以静态分配列表节点数组,然后使用整数索引作为每个节点的"上一个"和"下一个"值,而不是指针.我在过去做过这个以节省一点内存(因为整数可以是2或4个字节,而在64位系统上,指针将是8个字节)

  • 这是一个链表. (6认同)
  • @Jeremy:正如比利所说,你所描述的并不是结构的真正定义的链表. (5认同)
  • 它是一个链表,所有节点占用一个连续的内存空间.来自维基百科:"链表是一种数据结构,由一系列数据记录组成,因此在每个记录中都有一个字段,其中包含序列中下一条记录的引用(即链接)." @Jeremy Friesner描述的内容满足了这个定义. (5认同)
  • 但那时它不是一个链表,它是一个矢量. (3认同)
  • 节点位于向量中(“std::vector”或其他),但它不具有“std::vector&lt;T&gt;”的性能特征。 (2认同)
  • 对定义争论似乎有点愚蠢,但我将其称为具有极其简单的自定义节点分配器算法的链表。@Billy,我认为你对负债的看法是不正确的;这可以在不需要迭代器失效的情况下实现,并且只需在数组已满时插入失败即可避免整个底层数组的重新分配。 (2认同)
  • @billy:根据你的逻辑,如果池使用连续的内存,使用池化分配器的std :: map也将是一个向量. (2认同)
  • @Billy:是的,我正在做出这种权衡,但我在最初的答案中已经说过了。我认为结果仍然是一个链表,以计数的方式(O(1)插入/删除,O(N)查找时间,上一个/下一个链接,不可变/持久节点地址) (2认同)

DVK*_*DVK 11

是的,这是可能的.使用数组索引而不是指针.

  • Billy如果列表中的条目具有指向hte列表中"previous"和"next"条目的链接,则它是链接列表.最初的"链接列表"实现是磁盘上的数据库结构,它具有"上一个"和"下一个"的逻辑指针 (7认同)
  • 对不起,没有代码示例,因为这对我来说闻起来像家庭作业,我宁愿不回答h/w问题,除非海报是关于事实的. (4认同)
  • 它仍然是一个链表,但它仍然使用指针.这个术语是"基指针". (4认同)
  • 你的意思是像std :: vector <std :: pair <T,std :: size_t >>? (3认同)
  • @DVK:是的,那么你的阵列也不会是一个. (2认同)

Cra*_*der 5

来自维基百科:

在计算机科学中,链表是由一系列数据记录组成的数据结构,使得在每个记录中存在包含到序列中的下一记录的引用(即,链接)的字段.

该定义中没有任何内容指定存储或使用引用的方式.如果您不存储引用,则它不是链接列表 - 它是其他内容.

如果您的目标仅仅是避免使用指针(或对象引用),那么使用带索引的向量是一种常见的实现方式.(使用向量/索引实现的原因之一是持久性:在活动内存空间之外正确地持久保存指针/对象引用非常困难.)


MSa*_*ers 5

是:

class node { 
  std::string filenameOfNextNode;
  std::string filenameOfPrevNode;
  std::string data;
  node nextNode() {
    node retVal;
    std::ifstream file(filenameOfNextNode.c_str());
    retVal.filenameOfNextNode = file.getline();
    retVal.filenameOfPrevNode = file.getline();
    retVal.data = file.getline();
    return retVal;
  }
};
Run Code Online (Sandbox Code Playgroud)

受到关于链表起源的评论的启发


Bil*_*eal -10

使用 C++ 可以在不使用指针(下一个节点)的情况下实现链接列表数据结构吗?
不。