首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用POSIX函数清理整个POSIX树?

如何使用POSIX函数清理整个POSIX树?
EN

Stack Overflow用户
提问于 2019-08-31 18:37:52
回答 2查看 290关注 0票数 3

在用tsearch填充了POSIX二叉树之后,如何清理整个树呢?GCC提供了tdestroy作为扩展,但是如果您想使用POSIX专用函数,您如何才能这样做呢?

我当前的实现使用twalk遍历树,对于endorderleaf节点,调用tdelete,但这可以理解地显示关于const-正确性的警告:

代码语言:javascript
复制
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的应用程序,预期的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的优点(或它们的缺乏)进行辩论。

票数 6
EN

Stack Overflow用户

发布于 2019-08-31 19:13:57

提出的从twalk()action调用action的解决方案与POSIX对actioncompar不改变树的要求相冲突,在实践中,在免费或不完全清理之后可能会使用。

我认为最好的方法是不使用tsearch/tfind/tdelete/twalk,也不分配新的内存来存储twalk()结果,然后再使用tdelete()

不使用tsearch/tfind/tdelete/twalk也可能允许数据结构(如基尝试和哈希表)在现代体系结构上比二叉树更有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57740738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档