我们需要为链表节点分配内存吗?

时间:2013-08-23 05:13:48

标签: c++ c linked-list malloc free

到目前为止,我看到了两种启动节点的方法?

  1. Node c={6, NULL};
    Node b={3, &c};
    Node a={1, &b};
    Node *root = &a;
    
  2. Node * new_Node = (Node*)malloc(sizeof(Node));
    new_Node->data = 10;
    new_Node->next = &m;
    
  3. 哪个更好?哪个是对的?

    另一个问题是我们如何释放记忆?

    对于1,我们不需要释放mem吗?

    对于2,对于下一个指针free(root->next)root->data=NULL,这是删除节点的正确方法吗?

2 个答案:

答案 0 :(得分:2)

两者都是正确的。第一个依赖于在堆栈上实例化对象并将它们分配给Node *,然后在堆上实例化对象(使用malloc)。

free可用于释放malloc分配的内存。

在第一种情况下你是对的 - 你不需要释放mem。

在第二种情况 - 链接列表 - 创建一个自由包装器,在其中传递Node **,遍历链表直到获得NULL节点,保存下一个节点,然后free当前一。最后,您可以选择将参数设置为NULL

答案 1 :(得分:2)

对于#1,您不需要释放内存。局部变量在堆栈中。

free(root->next)

这不会释放一切。这只会释放一个节点。

没有一个更好或更好。这取决于你想要做什么。决定因素是您是否知道在程序开始运行之前要创建多少个对象。如果你这样做,那么#1(在堆栈上创建局部变量)是可以的。例如,如果您确定永远不会有超过100个节点,则可以创建大小为100的节点数组。

Node NodeList[100];

如果您事先不知道大小,则必须使用malloc / free管理堆上的节点;