#ifndef BST_H #define BST_H #define bst_declare(name, type, idx_type) struct { \ struct { \ idx_type idx; \ type elem; \ void *left; \ void *right; \ } *head; \ } name #define bst_init(name) do { \ (name).head = NULL; \ } while (0) #define bst_node_type(name) typeof(*((name).head)) #define bst_insert(name, _elem, _idx) do { \ bst_node_type(name) **cur = NULL; \ \ for (cur = &((name).head); ;) { \ assert(cur != NULL); \ \ if (*cur == NULL) { \ (*cur) = malloc(sizeof(bst_node_type(name))); \ assert(*cur != NULL); \ (*cur)->idx = _idx; \ (*cur)->elem = _elem; \ (*cur)->left = NULL; \ (*cur)->right = NULL; \ break; \ } else { \ assert((*cur)->idx != _idx); \ \ if (_idx < (*cur)->idx) { \ cur = (bst_node_type(name) **)&((*cur)->left); \ } else { \ cur = (bst_node_type(name) **)&((*cur)->right); \ } \ } \ } \ } while (0) #define bst_find(name, _idx, _elemp) do { \ bst_node_type(name) *cur = NULL; \ \ assert((_elemp) != NULL); \ \ for (cur = (name).head; cur != NULL; ) { \ if (cur->idx == _idx) { \ break; \ } \ \ if (_idx < cur->idx) { \ cur = (bst_node_type(name) *)(cur->left); \ } else { \ cur = (bst_node_type(name) *)(cur->right); \ } \ } \ \ if (cur != NULL) { \ *(_elemp) = ((cur)->elem); \ } else { \ *(_elemp) = NULL; \ } \ } while (0); #if 0 else { \ cur = &((bst_node_type(name)((*cur)->right))); \ } \ (*cur).elem = elem; \ (*cur).idx = idx; \ } #endif #endif /* BST_H */