我的代码工作实现了大量的mallocs。它有
struct* node myList;
struct node { ... } // contains stuff
struct* node_constructor(...) {
node* tempnode = (node*) malloc(sizeof(node));
node* next = ...;
... // some other info
}
然后在我的主函数中调用
myList = node_constructor(myList,otherarguments...);
我认为可能有办法做某些事情,比如
temp = (node*) malloc(sizeof(node)*numberOfNodes);
for(i=0; i<numberOfNodes;i++) { temp[i].next = temp[i-1]; ... } // wrong?
temp[numberOfNodes-1]; // set myList equal to the last one
并摆脱构造函数和所有那些单独的mallocs,我似乎对如何处理我的malloced空间感到困惑。所以temp
是(节点*),因此我非常确定我的temp[i].next = temp[i-1]
事情是错误的......也许其他一些想法也是如此。如果有人有任何意见/建议,我会很感激。
答案 0 :(得分:1)
好的,当然,你可以这样做,有点儿。只要温度足够大,你事先知道它的大小。并且temp
更可能是void*
或一些通用容器,只是挂在未指定的内存而不是节点上。 (因为它不是一个节点,所以你的所有节点都在这里。temp[x]
当temp
被malloced时,它是一种黑客攻击。)
但现在您想要在列表中添加另一个节点。你是怎么做到的?
单个mallocs允许您将单个项目添加到列表中。如果您想要在列表中添加多个项目,那么您可以多次调用各个函数。
分配大量内存并将其分解为零碎部分的想法是一个有效的想法,它具有一些性能优势,但它的利基使用有限。
为一个以上的项目分配足够的内存更方便和常见。你没错,但请相信我,先学会正常的方法。
答案 1 :(得分:1)
如果要使用数组返回列表,则无需使用下一个指针 - 下一个对象是数组中的下一个索引。
与链表实现相比,数组列表实现有优点和缺点。
答案 2 :(得分:0)
理想情况下,您将拥有这样的节点:
typedef struct node
{
struct node* next;
struct node* prev; // optional for double-linked list
uint8_t* data;
size_t data_size;
} node_t;
然后将其创建为
result_t list_add (const void* data, size_t size)
{
if(list_is_full()) // if applicable
{
return list_is_full_error;
}
node_t* new_node = node_constructor(data, size);
if(new_node == NULL)
{
return memory_error;
}
list_add(new_node);
return ok;
}
static node_t* node_constructor (const void* data, size_t size)
{
node_t* new_node = malloc(*new_node);
if(new_node == NULL)
{
return NULL;
}
new_node->data = malloc(size);
if(new_node->data == NULL)
{
return NULL;
}
new_node->size = size;
memcpy(new_node->data, data, size);
return new_node;
}
static void list_insert (node_t* new_node)
{
// add the node to the linked list here
// set next/prev pointers of the new node and of adjacent nodes
// increase node counter (linked list size) if applicable
}