Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中分配一个连续的链表_C_List_Malloc - Fatal编程技术网

在c中分配一个连续的链表

在c中分配一个连续的链表,c,list,malloc,C,List,Malloc,我正在尝试用c语言创建一个链表。我想为列表分配内存,以便所有节点都连续存储在内存中。 也许阵列结构是一种可行的方法。 有什么想法吗?如果你在看一个链表,不要担心它们在内存中的位置。这就是节点上的指针的用途 如果希望它们按顺序排列,请分配一个数组。是的,请使用数组。更有趣的是你为什么想要这个。如果您的程序需要这样做,那么您需要确保您的数组足够大,可以存储可能分配的所有节点。如果没有,则可以分配批节点 仅供参考。我在过去看到过这种策略,它假设顺序分配的节点在搜索列表时会导致更少的缓存未命中。在兴趣系

我正在尝试用c语言创建一个链表。我想为列表分配内存,以便所有节点都连续存储在内存中。 也许阵列结构是一种可行的方法。
有什么想法吗?

如果你在看一个链表,不要担心它们在内存中的位置。这就是节点上的指针的用途


如果希望它们按顺序排列,请分配一个数组。

是的,请使用数组。更有趣的是你为什么想要这个。如果您的程序需要这样做,那么您需要确保您的数组足够大,可以存储可能分配的所有节点。如果没有,则可以分配批节点


仅供参考。我在过去看到过这种策略,它假设顺序分配的节点在搜索列表时会导致更少的缓存未命中。在兴趣系统中,这实际上并没有给性能带来多少改进。[当然没有足够的评测!]

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

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;
}
struct节点{
结构节点*下一步;
//这里还有其他数据。
};
节点*自由列表;
#定义块大小为1024
void initialize(){
自由列表=malloc(块大小*sizeof(结构节点));
对于(i=0;不精确;
返回ret;
}
void free_节点(结构节点*n){
n->next=自由列表;
自由列表=n;
}

您可以这样做

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

struct node linkedlist[50];

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

根据定义,数组在内存中是连续排列的,所以是的。感谢它们需要连续存储,因为我正在尝试执行某些操作,所以在优化性能时,将链表单元格分配到连续位置似乎是一种合乎逻辑的方法内存可能是有益的。您可以获得空间缓存局部性,并且只要您不进行大量的插入和删除,该局部性通常会在链表的整个生命周期内保持不变。当按顺序遍历链表时,您往往会享受缓存前瞻的好处。RAM很慢,这可以避免频繁的缓存miKevinDice我100%同意。事实上,我甚至在代码审查期间告诉人们,除非你能告诉我为什么你想要一个LinkedList而不是ArrayList(在Java中,但在大多数语言中,原则是成立的),然后用ArrayList替换它。然而,OP是强制执行的(可能是通过一项任务)创建一个链表。当然,由数组支持并不能很好地利用链表的链接特性。