Implement a trie, sans removal.
This commit is contained in:
63
include/trie.h
Normal file
63
include/trie.h
Normal file
@@ -0,0 +1,63 @@
|
||||
#ifndef LIBABACUS_TRIE_H
|
||||
#define LIBABACUS_TRIE_H
|
||||
|
||||
#include "ll.h"
|
||||
#include "result.h"
|
||||
|
||||
/**
|
||||
* A node in the trie.
|
||||
*/
|
||||
struct libab_trie_node_s {
|
||||
/**
|
||||
* The "child" node, which points
|
||||
* to the next layer of the trie, housing
|
||||
* children that have a prefix ending in this node's key value.
|
||||
*/
|
||||
struct libab_trie_node_s* child;
|
||||
/**
|
||||
* The "next" node, which points
|
||||
* to the sibiling of this tree, wich has the same prefix
|
||||
* as this node.
|
||||
*/
|
||||
struct libab_trie_node_s* next;
|
||||
/**
|
||||
* The values associated with the key ending with
|
||||
* this node's key value.
|
||||
*/
|
||||
ll values;
|
||||
/**
|
||||
* The last letter of the key, which this node represents.
|
||||
* The remainder of the key is encoded in nodes preceding this one.
|
||||
*/
|
||||
char key;
|
||||
};
|
||||
|
||||
/**
|
||||
* A struct that represents a trie.
|
||||
*/
|
||||
struct libab_trie_s {
|
||||
/**
|
||||
* The first search node in this trie.
|
||||
*/
|
||||
struct libab_trie_node_s* head;
|
||||
/**
|
||||
* The empty list returned if no value is found.
|
||||
* Note that existing nodes return their own linked
|
||||
* list of values, even if empty. However, for keys
|
||||
* that don't exist as prefixes in the trie,
|
||||
* this list is returned to maintain consistency:
|
||||
* a list is always returned containing the values
|
||||
* of the trie associated with the given key.
|
||||
*/
|
||||
ll empty_list;
|
||||
};
|
||||
|
||||
typedef struct libab_trie_s libab_trie;
|
||||
typedef struct libab_trie_node_s libab_trie_node;
|
||||
|
||||
void libab_trie_init(libab_trie* trie);
|
||||
libab_result libab_trie_put(libab_trie* trie, const char* key, void* value);
|
||||
const ll* libab_trie_get(libab_trie* trie, const char* key);
|
||||
void libab_trie_free(libab_trie* trie);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user