首页 > 解决方案 > 你怎么能用 POSIX 函数清理整个 POSIX 树?

问题描述

用 填充了 POSIX 二叉树后tsearch,如何清理整个树?GCCtdestroy作为扩展提供,但是如果你想使用 POSIX-only 函数,你怎么做呢?

我当前twalk的实现用于遍历树,对于endorderleaf节点,调用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 标准的应用程序的预期方法是什么?

标签: cposix

解决方案


函数族的 POSIX 描述tsearch()有一个信息丰富的示例部分,它显示了标准如何认为您可以删除树的所有元素(作为如何使用函数的更大、完整示例的一部分):

/* Delete all nodes in the tree */
while (root != NULL) {
    elementptr = *(struct element **)root;
    printf("deleting node: string = %s,  count = %d\n",
           elementptr->string,
           elementptr->count);
    tdelete((void *)elementptr, &root, delete_root);
    free(elementptr);
}

基本上,它会反复删除根节点,tdelete()直到不再有要删除的根节点。该delete_root()函数也显示了——它是一个空操作,返回 0 表示成功。

我们可以在调用tdelete().


推荐阅读