在c中分配连续的链表

时间:2011-02-17 05:31:43

标签: c list malloc

我试图在c中创建链接列表。扭曲是我想为列表分配内存,以便所有节点连续存储在内存中。 也许阵列结构是可行的方法。 有什么想法吗?

4 个答案:

答案 0 :(得分:6)

显而易见的方法是在块中分配多个节点,然后将它们链接到一个空闲列表中。当您需要将一个节点添加到链接列表时,您将从空闲列表的头部获取一个节点。如果要删除节点,请将其链接回空闲列表:

struct node { 
     struct node *next;
     // other data here.
};

node *free_list;

#define block_size 1024

void initialize() {
    free_list = malloc(block_size * sizeof(struct node));

    for (i=0; i<block_size-1; i++)
        free_list[i].next = &free_list[i+1];
    free_list[block_size-1].next = NULL;
}

struct node *alloc_node() { 
    struct node *ret;
    if (free_list == NULL)
        return NULL;
    ret = free_list;
    free_list = free_list->next;
    return ret;
}

void free_node(struct node *n) { 
    n->next = free_list;
    free_list = n;
}

答案 1 :(得分:0)

如果您正在查看链接列表,请不要担心它们在内存中的位置。这就是节点上指针的用途。

如果你想要它们顺序,请分配一个数组。

答案 2 :(得分:0)

是的,使用数组。更有趣的是为什么你想要这个。如果您的程序要求它工作,那么您需要确保您的阵列足够大以存储可能分配的所有节点。如果没有,您可以分配批量节点。

FYI。我已经看到过去使用过这种策略,假设顺序分配的节点在搜索列表时会导致更少的缓存未命中。在感兴趣的系统中,实际上并没有提供太多的性能改进。 [当然没有足够的分析!。]

答案 3 :(得分:0)

你可以做这样的事情

struct node
{    
    int data;    
    struct node *next;    
};

struct node linkedlist[50];

这将为连续位置的链表结构分配空间。