用填充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);
}
}
Run Code Online (Sandbox Code Playgroud)
对于符合POSIX的应用程序,预期的方法是什么?
POSIX tsearch()函数系列的描述包含一个内容丰富的“ 示例”部分,该部分显示标准如何认为您可以删除树的所有元素(作为使用函数的一个完整示例的一部分):
Run Code Online (Sandbox Code Playgroud)/* 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()。
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |