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

Mar*_*son 3 c posix

用填充POSIX二叉树后tsearch,如何清理整个树呢?GCC提供tdestroy了扩展功能,但是如果您想使用仅POSIX的功能,该怎么做?

我当前的实现使用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);
        }
}
Run Code Online (Sandbox Code Playgroud)

对于符合POSIX的应用程序,预期的方法是什么?

Jon*_*ler 5

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);
}
Run Code Online (Sandbox Code Playgroud)

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

我们可以在致电中辩论演员表的优缺点(或没有)tdelete()

  • 不幸的是,Linux程序员手册中没有这样的内容。截至4.16,它的全部内容是如何公开和使用`tdestroy`。 (3认同)