如何用数组实现紧凑的链表?

时间:2014-03-22 06:18:14

标签: c++ algorithm linked-list clrs

以下是锻炼的问题CLRS 10.3-4我正在努力解决

通常希望将双链表的所有元素保存在存储中, 例如,使用多数组表示中的前m个索引位置。 (在分页的虚拟内存计算环境中就是这种情况。)解释如何实现ALLOCATE OBJECT和FREE OBJECT过程,以便表示紧凑。假设没有指向列表本身之外的链表的元素的指针。 (提示:使用堆栈的数组实现。)

到目前为止,这是我的解决方案

int free; 
int allocate()
{
    if(free == n+1)
        return 0;
    int tmp = free;
    free = next[free];
    return tmp;
}
int deallocate(int pos)
{

    for(;pos[next]!=free;pos[next])
    {
        next[pos] = next[next[pos]];
        prev[pos] = prev[next[pos]];
        key[pos] = key[next[pos]];
    }
    int tmp = free;
    free = pos;
    next[free] = tmp;
}

现在,问题是,如果是这种情况,我们不需要链表。如果删除是O(n),我们可以使用普通数组实现它。其次我没有使用堆栈的数组实现。捕获量在哪里?我该怎么开始?

1 个答案:

答案 0 :(得分:-1)

您不必立即缩小列表。只需留下一个洞并将该洞连接到您的空闲列表即可。一旦你分配了内存,它就是你的。所以,让我们说你的页面大小是1K。即使列表为空,您的初始分配列表大小也将为1K。现在,您可以非常有效地添加和删除项目。

然后向pack列表引入另一种方法,即删除所有洞。请记住,在调用pack-method之后,所有'引用'失效。

相关问题