1

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

  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;
    

哪个更好?哪个是对的?

另一个问题是我们如何释放内存?

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

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

4

2 回答 2

2

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

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

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

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

于 2013-08-23T05:20:40.997 回答
2

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

free(root->next)

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

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

Node NodeList[100];

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

于 2013-08-23T05:23:04.173 回答