diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2019-02-26 15:12:56 +0100 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2019-02-26 15:12:56 +0100 |
commit | 23e4967fd42a6a2bee5c44213be4df61ff546b13 (patch) | |
tree | 6347cd19fae83dc6766c587911682b7bffc36d39 /trie.inc.h | |
parent | Cleanup. (diff) | |
download | calp-23e4967fd42a6a2bee5c44213be4df61ff546b13.tar.gz calp-23e4967fd42a6a2bee5c44213be4df61ff546b13.tar.xz |
WIP.
Diffstat (limited to '')
-rw-r--r-- | trie.inc.h | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -6,6 +6,8 @@ #include "err.h" #include "macro.h" +#include "linked_list.inc.h" +#include "strbuf.h" INIT_F ( TRIE(TYPE) ) { NEW(TRIE_NODE(TYPE), t, '\0'); @@ -187,4 +189,30 @@ int DEEP_COPY(TRIE(TYPE)) (TRIE(TYPE)* dest, TRIE(TYPE)* src) { return DEEP_COPY(TRIE_NODE(TYPE))(dest->root, src->root); } +void KEYS(TRIE_NODE(TYPE)) (TRIE_NODE(TYPE)* node, LLIST(strbuf)* list, strbuf* path) { + if (node == NULL) return; + + + if (node->value != NULL) { + strbuf_append(path, node->c); + PUSH(LLIST(strbuf))(list, path); + strbuf_pop(path); + } + if (node->next != NULL) { + KEYS(TRIE_NODE(TYPE)) (node->next, list, path); + } + if (node->child != NULL) { + strbuf_append(path, node->c); + KEYS(TRIE_NODE(TYPE)) (node->child, list, path); + strbuf_pop(path); + } +} + +LLIST(strbuf)* KEYS(TRIE(TYPE)) (TRIE(TYPE)* trie) { + NEW(LLIST(strbuf), retlist); + SNEW(strbuf, key); + KEYS(TRIE_NODE(TYPE)) (trie->root, retlist, &key); + return retlist; +} + #endif /* TYPE */ |