用填充POSIX二叉树后tsearch
,如何清理整个树呢?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的应用程序,预期的方法是什么?
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()
。