tsearch , tdelete , tfind 或 twalk 子例程

用途

管理二进制搜索树。

标准 C 库 (libc.a)

语法

#include <search.h>
void *tsearch ( Key RootPointer,  ComparisonPointer)
const void *Key;
void **RootPointer;
int (*ComparisonPointer) (const void *Element1, const void *Element2);
void *tdelete (Key, RootPointerComparisonPointer)
const void *Key;
void **RootPointer;
int (*ComparisonPointer) (const void *Element1, const void *Element2);
void *tfind (KeyRootPointerComparisonPointer)
const void *Key;
void *const *RootPointer;
int (*ComparisonPointer(const void *Element1, const void *Element2);

void twalk ( Root Action)
const void *Root;
void (*Action) (const void *Node, VISIT Type, int Level);

描述

搜索删除特德特瓦尔克 子例程处理二进制搜索树。 与由 ComparisonPointer 参数指定的用户提供的例程进行比较。 此例程是使用两个参数调用的,即指向正在比较的元素的指针。

搜索 子例程执行二进制树搜索,将指针返回到一个树中,该树指示可以找到 参数指定的数据的位置。 如果找不到由 参数指定的数据,那么会将该数据添加到树中的正确位置。 如果没有足够的可用空间来创建新节点,那么将返回空指针。 只有指针被复制,所以调用例程必须存储数据。 RootPointer 参数指向指向树根的变量。 如果 RootPointer 参数是空值,那么该变量将设置为指向新树的根。 如果 RootPointer 参数是条目上的空值,那么将返回空指针。

删除 子例程删除由 参数指定的数据。 RootPointer ComparisonPointer 参数执行的函数与它们对 tsearch 子例程执行的函数相同。 如果删除的节点是二进制树的根,那么将更改 RootPointer 参数指向的变量。 删除 子例程返回指向已删除节点的父节点的指针。 如果找不到该数据,那么将返回空指针。 如果 RootPointer 参数在条目上为空,那么将返回空指针。

特德 子例程搜索二进制搜索树。 与 搜索 子例程一样, 特德 子例程在树中搜索节点,并返回指向它的指针 (如果找到)。 但是,如果找不到它,那么 特德 子例程将返回空指针。 特德 子例程的参数和 搜索 子例程的参数相同。

twalk 子例程单步执行由 RootPointer 参数指向其根的二进制搜索树。 (树中的任何节点都可以用作根以单步执行该节点下的树。) 行动 参数是要在每个节点上调用的例程的名称。 由 行动 参数指定的例程是使用三个参数调用的。 第一个参数是当前所指向的节点的地址。 第二个参数是枚举数据类型中的值:

typedef enum [preorder, postorder, endorder, leaf] VISIT;

(此数据类型在 search.h 文件中定义。) 第二个参数的实际值取决于在树的深度第一次,第二次或第三次遍历期间是否访问过该节点,或者该节点是否为 。 叶节点是不是另一个节点的父节点的节点。 第三个参数是树中节点的级别,其中根节点的级别为零。

虽然已声明为指针到空的类型,但指向键和树根的指针应该是指针到元素的类型,并且应该强制转换为指针到字符的类型。 虽然已声明为 "指针到字符" 类型,但返回的值应强制转换为 "指针到元素" 类型。

参数

描述
key 指向所要定位的数据。
ComparisonPointer 指向比较函数,该函数通过两个参数进行调用,这些参数指向正在比较的元素。
RootPointer 指向一个变量,该变量反过来指向树的根部。
操作 指定要在每个节点上调用的例程。
指向二元搜索节点的根目录。

返回值

比较函数对其参数进行比较并返回如下值:

  • 如果第一个参数小于第二个参数,那么 ComparisonPointer 参数返回小于 0 的值。
  • 如果第一个参数等于第二个参数,那么 ComparisonPointer 参数返回值 0。
  • 如果第一个参数大于第二个参数,那么 ComparisonPointer 参数返回大于 0 的值。

比较功能不需要对每个字节进行比较,因此除了要比较的值之外,元素中还可以包含任意数据。

如果找到节点,那么 搜索特德 子例程将返回指向它的指针。 如果找不到节点,那么 搜索 子例程将返回一个指向所插入项的指针,而 特德 子例程将返回一个空指针。 如果没有足够的空间来创建新节点,那么 搜索 子例程将返回空指针。

如果 RootPointer 参数是条目上的空指针,那么 tsearchtdelete 子例程将返回空指针。

删除 子例程返回指向已删除节点的父代的指针。 如果找不到该节点,那么将返回空指针。