C中的内存分配,堆中的LInked List

时间:2015-01-29 17:47:57

标签: c malloc

我正在建立一个链接列表并尝试为此分配内存

struct node *new_node = (node*) malloc(sizeof(node) * 5);

为5个节点提供足够的内存。现在通过以下方式访问第一个节点:

new_node->data = new_data;

很好,但是当我将另一个节点链接到new_node->接下来,我忘了我怎么说新节点是我已经分配的内存的一部分。每次我想要一个新节点时,我都不想使用malloc作为我正在进行的作业的目的,我们希望尽可能少地使用malloc。

任何线索都非常感激,到目前为止,我还没有能够在宽阔的网上找到我需要的东西。

约翰!

3 个答案:

答案 0 :(得分:0)

你弄错了,你不需要为五个节点分配空间并用第一个节点指向它们,而不是

struct node *head = malloc(sizeof(struct node));
if (head == NULL)
    return errorHandler();
head->next = malloc(sizeof(struct node));
.
.
.

等等。

我在那里做的是为一个节点分配空间,当我需要一个新节点时,我为它分配空间并使用next的{​​{1}}字段指向它。

答案 1 :(得分:0)

当单独分配任何新元素的内存时,非常简化的解决方案:

#include <stdio.h>
#include <stdlib.h>

struct node
{
	int data; // some data, not a link to next element
	struct node * next;
};

int main()
{
	struct node *head = NULL; //
	struct node *tail = NULL; //
	// creating the first node
	head = (node*) malloc(sizeof(node));
	if(head != NULL)
	{
		tail = head;
		tail->next = NULL;
		// fill the data here
	}
	// creat any more
	for(int i = 1; i < 5; i++)
	{
		tail->next = (node*) malloc(sizeof(node)); // create new
		if(tail->next != NULL)
		{
			tail = tail->next; // move tail to next
			tail->next = NULL;
			// fill the data here
		}
	}
}

当然,节点(插入,删除等)的操作应该被组织为函数。

但是,如果您想保存原始内存分配方法,请考虑以下事项:

    // allocation memory for 5 elements
	struct node *new_node = (node*) malloc(sizeof(node) * 5);
	// arranging pointers
	for(int i = 0; i < 4; i++)
	{
		new_node[i].next = &new_node[i+1];
	}
	new_node[4].next = NULL; // like a sign of the END

答案 2 :(得分:0)

Node* five = malloc( 5 * siozeof(Node) );
int nxt = 0;

Node* p = &five[nxt++];
p->next = &five[nxt++];