【问题标题】:Why need to store next item pointer in linked list为什么需要将下一项指针存储在链表中
【发布时间】:2017-11-25 23:42:09
【问题描述】:

当我在我的简单虚拟机中处理某些链表数据结构时,我突然想到了这个问题,那么为什么我们需要在数据结构本身中存储指向下一个元素的指针,如下所示:

struct Name
    {
       int element1;
       float element2;
       void *nextItem;
    };

为什么不存储指向数组中下一项的指针,以便我们可以直接访问任何节点?我们可以制作一个数组的链表,以确保我们在向列表中添加新项目时具有类似的灵活性,例如:

struct Name
    {
      int element1;
      float element2;
    };

struct arrayOfpointers
 {
   void *Items[FIXED_SIZE];
   void *nextArray;
 };

arrayOfpointers->Items[1] 是指向 Name 数据结构的第二个元素的指针?这种技术是不是比普通技术更快地到达链表的特定项?

【问题讨论】:

  • 不,因为您仍然需要遍历数组,现在您已经添加了额外的内存(用于数组和内容)和代码。为什么你会认为遍历数组内容会比链表更快?另外,当您需要插入或删除元素时会发生什么?您必须重新排列整个数组,而使用链表则直接进行。
  • @KenWhite 如果 FIXED_SIZE 常量设置得当,内存开销可以忽略不计
  • 它将是 FIXED_SIZE * sizeof(pointer),加上迭代的代码,加上任何插入的额外内存分配,加上标记数组中最后一项的代码(如果它是 FIXED_SIZE 但你没有' t 使用全部或删除一个,您必须跟踪使用的最后一个索引)。这是对零收益的代码和精力和开销的浪费。
  • 是的,但是我已经以传统方式将指针存储在节点中,因此唯一的开销是在不使用它们的情况下分配的任何额外数组项+下一个数组的指针,所以如果我们设置小或FIXED_SIZE 的中等值,内存开销很小甚至可以忽略不计

标签: c arrays pointers data-structures linked-list


【解决方案1】:

为什么不将指向下一项的指针存储在数组中以便我们可以直接访问任何节点?

因为这会将您的链表数据结构转换为数组。

基本上,这将使您的数据结构以几种不同的方式表现:

  • 中间的插入将是 O(n) 而不是 O(1)
  • 删除将是 O(n) 而不是 O(1)
  • 插入需要重新分配和复制“尾部”
  • 删除需要“尾巴”的副本

如果您的系统可以使用包含 O(n) 次插入和删除的数据结构,则可以使用数组来代替:

struct Name {
    int element1;
    float element2;
} nameArray[FIXED_SIZE];

不需要next 链接,因为数据将按顺序存储在内存中

【讨论】:

  • 你是对的,但是在某些情况下(例如我的情况),这种技术提供了快速随机访问(我使用这个列表来存储动态分配的 大到中页内存)和数组链表可以帮助减少删除项目所需的工作,因此我们只需要更改数组链表中的一个数组
  • @ParcRoi 如果您需要快速访问和快速分配的组合,请考虑skip lists,它可以让您非常快速地访问数据(尽管不完全是随机访问)。
  • 不错的技术,也许我会尝试实现我的技术并测试它是如何工作的,如果它不起作用我可以试试你建议的技术(它看起来很优雅)。谢谢
【解决方案2】:

随机访问可能更快,但你必须考虑到列表上的每个操作都必须反映在地址数组上,并且每个 IO 都必须通过它。有点维护地狱。

如果你想做这样的事情,你总是可以创建一个节点指针数组

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2013-05-26
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多