指针和对象的实现

时间:2013-02-16 03:31:53

标签: data-structures

enter image description here

这是双链表的多数组表示的图像。带有键4的对象在原始链表中使用键16跟随对象。这里4出现在键[2]中,16出现在键[5]中。这里的概念是使用没有指针和对象的数组实现双链表。有人可以解释这些元素是如何相互联系的。

2 个答案:

答案 0 :(得分:2)

第一个密钥为9,存储在索引[7]。你知道这一点,因为L包含列表头部的索引(7)。当然,你可以看到它没有“普遍”价值。

从这里开始,列表中的下一个项目存储在索引[5]中。 (这就是它在索引[7]的数组中的“next”中告诉我们的内容。此单元格的键为16

从此处开始,[2],密钥为4[3]密钥为1。这是列表中的最后一项,因为它没有“下一个”。

如果你想倒退,你也可以查看“prev”值。重要的是要注意“next”和“prev”包含与“key”完全不同类型的数字。 Next和Prev指的是数组索引,在本实现中基本上取代了指针。键包含一个数值,表示列表中该点的节点的实际内容。

答案 1 :(得分:0)

您的数据结构可以正常运行。如果你正在编写C ++,你应该只定义next和prev。类型size_t。但是,我认为没有任何价值。

  1. 转到下一个元素需要额外的数学运算。使用指针链接的传统列表,您只需访问存储在pNext字段中的地址。使用链表,计算下一个元素的地址需要一次乘法和一次加法。

  2. 如果您的目标是优化内存布局以实现缓存友好性 - 它已在某些列表实现中完成。例如,微软在ATL中的实现就是这样做的。 CAtlList类不是使用new运算符分配元素,而是分批分配它们,这就是为什么标准STL列表在针对Microsoft版本进行基准测试时通常工作速度慢2倍。