static struct avl_node * avl_find_rec(struct avl_node *node, const void *key, avl_tree_comp comp) { int diff; if (NULL == comp) return avl_find_rec_ipv4(node, key); diff = (*comp) (key, node->key); if (diff < 0) { if (node->left != NULL) return avl_find_rec(node->left, key, comp); return node; } if (diff > 0) { if (node->right != NULL) return avl_find_rec(node->right, key, comp); return node; } return node; }
/** * Finds the first node in an avl-tree with a key greater or equal * than the specified key * @param tree pointer to avl-tree * @param key pointer to specified key * @return pointer to avl-node, NULL if no node with * key greater or equal specified key exists. */ struct avl_node * avl_find_greaterequal(const struct avl_tree *tree, const void *key) { struct avl_node *node, *next; int diff; if (tree->root == NULL) return NULL; node = avl_find_rec(tree->root, key, tree->comp, tree->cmp_ptr, &diff); /* go right as long as key>node.key */ while (diff > 0) { if (list_is_last(&tree->list_head, &node->list)) { return NULL; } node = (struct avl_node *)node->list.next; diff = (*tree->comp) (key, node->key, tree->cmp_ptr); } /* go left as long as key<=next_node.key */ next = node; while (diff <= 0) { node = next; if (list_is_first(&tree->list_head, &node->list)) { break; } next = (struct avl_node *)node->list.prev; diff = (*tree->comp) (key, next->key, tree->cmp_ptr); } return node; }
/** * Finds a node in an avl-tree with a certain key * @param tree pointer to avl-tree * @param key pointer to key * @return pointer to avl-node with key, NULL if no node with * this key exists. */ struct avl_node * avl_find(const struct avl_tree *tree, const void *key) { struct avl_node *node; int diff; if (tree->root == NULL) return NULL; node = avl_find_rec(tree->root, key, tree->comp, tree->cmp_ptr, &diff); return diff == 0 ? node : NULL; }
struct avl_node * avl_find(struct avl_tree *tree, const void *key) { struct avl_node *node; if (tree->root == NULL) return NULL; node = avl_find_rec(tree->root, key, tree->comp); if (NULL == tree->comp) { if (0 != ip4cmp(node->key, key)) return NULL; } else { if ((*tree->comp) (node->key, key) != 0) return NULL; } return node; }