到目前为止,我看到了两种启动节点的方法?
Node c={6, NULL};
Node b={3, &c};
Node a={1, &b};
Node *root = &a;
Node * new_Node = (Node*)malloc(sizeof(Node));
new_Node->data = 10;
new_Node->next = &m;
哪个更好?哪个是对的?
另一个问题是我们如何释放记忆?
对于1,我们不需要释放mem吗?
对于2,对于下一个指针free(root->next)
,root->data=NULL
,这是删除节点的正确方法吗?
答案 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管理堆上的节点;