C Library User 手册(16)
10.11 search.h
<search.h>头文件包含操作二进制搜索表和管理哈希搜索表的函数。
#include <search.h>
int hcreate(size_t nel); [POSIX]
void hdestroy(void); [POSIX]
ENTRY *hsearch(ENTRY item, ACTION action); [POSIX]
void tdelete(const void *key, void **rootp, int (*compar) (const void *, const void *)); [POSIX]
void *tfind(const void *key, const void * const *rootp, int (*compar) (const void *, const void *)); [POSIX]
void *tsearch(const void *key, void **rootp, int (*compar) (const void *, const void *)); [POSIX]
void twalk(const void *root, void (*action) (const void *, VISIT, int)); [POSIX]
10.11.1 hcreate
int hcreate(size_t nel); [POSIX]
hcreate函数分配并初始化哈希搜索表。nel参数指定了该表所容纳的最大条目数的估计值。除非进一步的内存分配失败,否则提供一个不足的nel值不会导致功能损害,尽管可能会出现性能下降。在使用hsearch的任何访问操作之前,必须使用hcreate函数进行初始化。
如果成功,hcreate函数返回一个非零值。否则,将返回一个0值,并设置errno来表示错误。
10.11.2 y1
double y1(double x); [POSIX]
y0 计算正整数值 x(表示为双精度)的 1 阶第二类线性无关贝塞尔函数。 如果成功,则函数返回计算值,否则将 errno 设置为 EDOM 并生成保留操作数错误。
10.11.3 hsearch
ENTRY *hsearch(ENTRY item, ACTION action); [POSIX]
使用hsearch来搜索哈希表。它返回一个进入哈希表的指针,表示一个项目的地址。项目参数是ENTRY类型的,这是一个结构类型,包含以下成员。
char *key comparison key.
void *data pointer to data associated with key.
hsearch使用的键比较函数是strcmp。
动作参数的类型是ACTION,这是一个枚举类型,定义了以下内容
值。
ENTER 在哈希表中插入项目。如果发现有相同键的现有项,则不会被替换。注意,项的键和数据元素直接被新的表项使用。在哈希表的有效期内,键的存储不能被修改。
FIND 在不插入项目的情况下搜索哈希表。
如果成功,hsearch返回一个指向与所提供的键匹配的哈希表项的指针。如果动作是FIND并且没有找到项目,或者如果动作是ENTER并且插入失败,则返回NULL并且设置errno来表示错误。如果动作是ENTER,并且表中已经存在与给定键匹配的条目,则返回现有的条目,并且不被替换。
10.11.4 tdelete
void tdelete(const void *key, void **rootp, int (*compar) (const void *, const void *)); [POSIX]
tdelete、tfind、tsearch和twalk函数根据Knuth(6.2.2)的算法T和D来管理二进制搜索树。用户传入的比较函数的返回值风格与strcmp相同。
tdelete从指定的二进制搜索树中删除一个节点,并返回一个指向要删除的节点的父节点的指针。它接受与tfind和tsearch相同的参数。如果要删除的节点是二进制搜索树的根,rootp将被调整。
如果rootp是NULL或者找不到数据,tdelete返回NULL。
10.11.5 tfind
void *tfind(const void *key, const void * const *rootp, int (*compar) (const void *, const void *)); [POSIX]
tfind在以rootp为根的二叉树中搜索与参数key相匹配的数据,如果找到则返回指向该数据的指针,如果没有则返回NULL。
如果rootp是NULL或者找不到数据集,tfind返回NULL。
10.11.6 tsearch
void *tsearch(const void *key, void **rootp, int (*compar) (const void *, const void *)); [POSIX]
tsearch与tfind相同,只是如果没有找到匹配,key会被插入树中并返回一个指针。如果rootp指向一个NULL值,就会创建一个新的二进制搜索树。
如果分配新节点失败(通常是由于缺乏可用的内存),tsearch函数返回NULL。
如果rootp是NULL或者找不到数据点,tsearch返回NULL。
10.11.6 twalk
void twalk(const void *root, void (*action) (const void *, VISIT, int)); [POSIX]
twalk行走以根为根的二进制搜索树,在每个节点上调用函数action。Action被调用时有三个参数:一个指向当前节点的指针,一个来自enum typedef enum {preorder, postorder, endorder, leaf }的值。VISIT;指定遍历类型,和一个节点级别(其中零级是树的根)。
twalk没有返回值。
10.12 setjmp.h
包括标准头文件<setjmp.h>以执行绕过正常函数调用和返回协议的控制转移。
#define setjmp(jmp_buf env) <int rvalue> typedef a-type jmp_buf;
void longjmp(jmp_buf env, int val);
10.12.1 jmp_buf
typedef a-type jmp_buf;
该类型是一个对象的数组类型a-type,你声明该对象用于保存由setjmp存储并由longjmp访问的上下文信息。
信息,该对象由setjmp存储并由longjmp访问。
10.12.2 longjmp
void longjmp(jmp_buf env, int val);
该函数导致执行setjmp的第二次返回,该函数将当前的
上下文的值在env中。如果val为非零,返回值为val;否则,返回值为1。
在setjmp存储当前上下文值时处于活动状态的函数必须没有向其调用者返回控制权。一个不具有易失性类型的动态持续时间的对象,如果其存储值在当前上下文值被存储后发生了变化,那么其存储值将是不确定的。
10.12.3 setjmp
#define setjmp(jmp_buf env) <int rvalue>
该宏将当前的上下文值存储在由env指定的数组中并返回0。以后调用longjmp访问相同的上下文值时,会使setjmp再次返回,这次返回的是一个非零值。你只能在以下表达式中使用宏setjmp。
■没有运算符
■只有单数运算符 !
■有一个关系或平等运算符(==, !=, <, <=, >, 或 >=),另一个操作数是整数常数表达式
你只能把这样的表达式作为do、expression、for、if、if-else、switch或while语句的表达式部分。