tsearch , tdelete , tfind 或 twalk 子例程
用途
管理二进制搜索树。
库
标准 C 库 (libc.a)
语法
#include <search.h> const void *Key;
void **RootPointer;
int (*ComparisonPointer) (const void *Element1, const void *Element2);
void *tdelete (Key, RootPointer, ComparisonPointer)
const void *Key;
void **RootPointer;
int (*ComparisonPointer) (const void *Element1, const void *Element2); void *tfind (Key, RootPointer, ComparisonPointer)
const void *Key;
void *const *RootPointer;
int (*ComparisonPointer) (const void *Element1, const void *Element2);描述
搜索, 删除, 特德 和 特瓦尔克 子例程处理二进制搜索树。 与由 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 参数是条目上的空指针,那么 tsearch 和 tdelete 子例程将返回空指针。
删除 子例程返回指向已删除节点的父代的指针。 如果找不到该节点,那么将返回空指针。