在用tsearch填充了POSIX二叉树之后,如何清理整个树呢?GCC提供了tdestroy作为扩展,但是如果您想使用POSIX专用函数,您如何才能这样做呢?
我当前的实现使用twalk遍历树,对于endorder和leaf节点,调用tdelete,但这可以理解地显示关于const-正确性的警告:
static void free_tree(const void *node, const VISIT which, const int depth)
{
struct search_entry *entry;
switch (which) {
case endorder:
case leaf:
entry = *(struct search_entry **)node;
tdelete(entry->key, &node, search_entry_compare);
free(entry);
}
}对于符合POSIX的应用程序,预期的方法是什么?
发布于 2019-08-31 20:21:04
关于tsearch()函数族的POSIX有一个信息丰富的示例部分,其中展示了标准认为可以删除树的所有元素(作为如何使用函数的更大、完整的示例的一部分):
/*删除树*/ while (root != NULL)中的所有节点(根= *(struct元素**);printf(删除节点: string = %s,count = %d\n",elementptr >string,elementptr> delete_root);tdelete(void *)elementptr,&root,delete_root);free(elementptr);
基本上,它使用tdelete()重复删除根节点,直到不再有要删除的根节点为止。还显示了delete_root()函数--它是一个为成功返回0的非op。
我们可以在对tdelete()的调用中对cast的优点(或它们的缺乏)进行辩论。
发布于 2019-08-31 19:13:57
提出的从twalk()的action调用action的解决方案与POSIX对action和compar不改变树的要求相冲突,在实践中,在免费或不完全清理之后可能会使用。
我认为最好的方法是不使用tsearch/tfind/tdelete/twalk,也不分配新的内存来存储twalk()结果,然后再使用tdelete()。
不使用tsearch/tfind/tdelete/twalk也可能允许数据结构(如基尝试和哈希表)在现代体系结构上比二叉树更有效。
https://stackoverflow.com/questions/57740738
复制相似问题