10.6.3 Starting at a Found Node |
To start from an item found in the tree, we use the same algorithm as rtbst_find().
400. <RTBST traverser search initializer 400> = void *
rtbst_t_find (struct rtbst_traverser *trav, struct rtbst_table *tree,
void *item)
{ struct rtbst_node *p; assert (trav != NULL && tree != NULL && item != NULL); trav->rtbst_table = tree; trav->rtbst_node = NULL; p = tree->rtbst_root; if (p == NULL) return NULL; for (;;)
{ int cmp = tree->rtbst_compare (item, p->rtbst_data, tree->rtbst_param); if (cmp == 0)
{ trav->rtbst_node = p; return p->rtbst_data; } if (cmp < 0)
{ p = p->rtbst_link[0]; if (p == NULL) return NULL; }
else
{ if (p->rtbst_rtag == RTBST_THREAD) return NULL; p = p->rtbst_link[1]; } } }
This code is included in 397.