tcbpg

Trie

Nov 30th, 2011
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. #ifndef TRIE_INCLUDED
  2. #define TRIE_INCLUDED
  3.  
  4. #include <cassert>
  5.  
  6. //Estado: Pasa tests (valgrind incluido) con un diccionario de 847 palabras.
  7. /*BUGS Y DETALLES CONOCIDOS:
  8.     Sobreescribe el valor si hay repetidos, lo cual genera perdidas de memoria. Se pide que la clave no este previamente definida para eso.
  9.     No tiene soporte para letras en mayuscula ni numeros ni caracteres
  10. */
  11.  
  12. #define ALPHABET_SIZE 26
  13. char alphabet[ALPHABET_SIZE] = {
  14.     'a','b','c','d','e','f','g','h',
  15.     'i','j','k','m','n','l','o','p','q',
  16.     'r','s','t','u','v','w','x','y','z'};
  17.  
  18. int chr2int(char c){
  19.     for(int i = 0; i < ALPHABET_SIZE; i++)
  20.         if(alphabet[i] == c) return i;
  21.     return -1;
  22. }
  23.  
  24. template<typename T>
  25. class DiccString{
  26.     public:
  27.         DiccString();
  28.         ~DiccString();
  29.         bool estaDef(std::string);
  30.         T & obtener(std::string); //PRE: la key esta definida en el diccionario
  31.         void definir(std::string, T e); //PRE: la key no esta definida
  32.     private:
  33.         struct Nodo{
  34.             T * value;
  35.             Nodo * keys[ALPHABET_SIZE];
  36.             Nodo(){
  37.                 value = NULL;
  38.                 for(int i = 0; i < ALPHABET_SIZE; i++)
  39.                     keys[i] = NULL;
  40.             }
  41.             void destruir(){
  42.                 for(int i = 0; i < ALPHABET_SIZE; i++)
  43.                     if(keys[i] != NULL){
  44.                         keys[i]->destruir();                   
  45.                         delete keys[i];                
  46.                     }
  47.                 if(value != NULL){             
  48.                     delete value;          
  49.                 }
  50.             }
  51.         };
  52.         Nodo * root;
  53. };
  54.  
  55. template<typename T>
  56. DiccString<T>::DiccString(){
  57.     root = NULL;
  58. }
  59.  
  60. template<typename T>
  61. DiccString<T>::~DiccString(){
  62.     if(root != NULL){
  63.         root->destruir();
  64.         delete root;
  65.     }
  66. }
  67.  
  68.  
  69. template<typename T>
  70. void DiccString<T>::definir(std::string s, T e){
  71.     if(root == NULL) root = new Nodo();
  72.     Nodo * n = root;
  73.  
  74.     for(unsigned int i = 0; i < s.size(); i++){
  75.         if(n->keys[chr2int(s[i])] == NULL)
  76.             n->keys[chr2int(s[i])] = new Nodo();
  77.  
  78.         n = n->keys[chr2int(s[i])];
  79.     }
  80.  
  81.     n->value = new T(e);
  82. }
  83.  
  84. template<typename T>
  85. bool DiccString<T>::estaDef(std::string s){
  86.     Nodo * n = root;
  87.     unsigned int i = 0;
  88.     for(i; i < s.size(); i++){
  89.         if(n == NULL) break;
  90.         n = n->keys[chr2int(s[i])];
  91.     }
  92.  
  93.     return i == s.size();
  94. }
  95.  
  96. template<typename T>
  97. T & DiccString<T>::obtener(std::string s){
  98.     Nodo * n = root;
  99.     for(unsigned int i = 0; i < s.size(); i++)
  100.         n = n->keys[chr2int(s[i])];
  101.  
  102.     return *(n->value);
  103. }
  104.  
  105. #endif
  106.  
Advertisement
Add Comment
Please, Sign In to add comment