【发布时间】: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