到目前为止,我看到了启动节点的两种方法?
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
,这是删除节点的正确方法吗?
两者都是正确的。第一种方法依赖于实例化堆栈上的对象并将它们分配给Node *
,而后一种方法是实例化堆上的对象(使用malloc
)。
free
可以用于释放malloc分配的内存。
第一种情况下你是对的——你不需要释放内存。
在第二种情况下——链表——在free上创建一个包装器,在其中传递一个Node **
,遍历链表直到得到NULL节点,保存下一个节点,然后将free
保存为当前节点。最后,也可以选择将参数设置为NULL
。
对于#1,您不需要释放内存。局部变量在堆栈上。
free(root->next)
这不会解放一切。这只释放了一个节点。
两者都不是更好或正确的。这取决于你想做什么。决定因素是你是否知道在程序开始运行之前要创建多少对象。如果你这样做了,那么#1(在堆栈上创建局部变量)就可以了。例如,如果你确信你的节点永远不会超过100个,你可以创建一个大小为100的节点数组。
Node NodeList[100];
如果您事先不知道大小,则必须使用malloc/free来管理堆上的节点;