| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #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 */
|