Advertisement
diofanto33

ADT dictionary

Jun 21st, 2023 (edited)
132
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.00 KB | Jokes | 0 0
  1. #include <assert.h>
  2. #include <stdlib.h>
  3. #include "dict.h"
  4. #include "string.h"
  5.  
  6. struct _dict_t {
  7.     struct _node_t *words;
  8.     struct _node_t *definitions;
  9.     unsigned int size;
  10. };
  11.  
  12. struct _node_t {
  13.     string elem;
  14.     struct _node_t *next;
  15. };
  16.  
  17. /*  @brief: Verifica que para todo diccionario se cumplan:
  18.  *  
  19.  *  1) Inicializacion: existencia
  20.  *  2) Orden con relacion a string_less (orden alfabetico)
  21.  *  3) Consistencia en la cantidad de nodos de ambas listas
  22.  *  4) Consistencia size en relacion length
  23.  *
  24.  *  @param: dict_t
  25.  *  @return: bool
  26.  */
  27.  
  28. static bool
  29. invrep(dict_t d)
  30. {
  31.     bool res = (d != NULL);
  32.     unsigned int len_w = 0u;
  33.     unsigned int len_d = 0u;
  34.     if(res && d->words != NULL)
  35.     {
  36.         struct _node_t *ps = d->words;
  37.         len_w = len_w + 1u;
  38.         while(res && ps->next != NULL)
  39.         {
  40.             res = res && string_less(ps->elem, ps->next->elem);
  41.             len_w = len_w + 1u;
  42.             ps = ps->next;
  43.         }
  44.         ps = NULL;
  45.         res = res && (len_w==d->size);
  46.     }
  47.     if(res && d->definitions != NULL)
  48.     {
  49.         struct _node_t *sp = d->definitions;
  50.         len_d = len_d + 1u;
  51.         while(sp->next != NULL)
  52.         {
  53.             len_d = len_d + 1u;
  54.             sp = sp->next;
  55.         }
  56.         sp = NULL;
  57.         res = res && (len_d==d->size);
  58.     }
  59.     res = res && (len_d==len_w) && (len_d==d->size);
  60.  
  61.     return(res);
  62. }
  63.  
  64. // returns the amount of nodes to skip when adding a new word
  65. /*
  66. static int
  67. nodes_to_skip(dict_t dict, string word)
  68. {
  69.     unsigned int numberToSkip = 0;
  70.     struct _node_t *sp = dict->words;
  71.     while(sp->words != NULL && string_less(dict->words, word))
  72.     {
  73.         numberToSkip = numberToSkip + 1u;
  74.     }
  75.     sp = NULL;
  76.  
  77.     return(numberToSkip);
  78. }
  79. */
  80. // returns the position of the word on the list of nodes (0 being the first node)
  81. // returns -1 if the word is not on the dict
  82.  
  83.  
  84. static int
  85. find_index_of_key(dict_t dict, string word)
  86. {
  87.     int index = 0;
  88.     struct _node_t *sp_w = dict->words;
  89.     bool res = string_eq(word, sp_w->elem);
  90.     while(sp_w->next != NULL && !res)
  91.     {  
  92.         res = string_eq(word, sp_w->elem);
  93.         if(!res)
  94.         {
  95.             index = index + 1;
  96.         }
  97.         sp_w = sp_w->next;
  98.     }
  99.     sp_w = NULL;
  100.     index = !res ? -1 : index;
  101.  
  102.     return(index);
  103. }
  104.  
  105. dict_t
  106. dict_empty(void)
  107. {
  108.     struct _dict_t *d = NULL;
  109.     d = malloc(sizeof(struct _dict_t));
  110.     assert(d != NULL);
  111.     d->words = NULL;
  112.     d->definitions = NULL;
  113.     d->size = 0u;
  114.     assert(invrep(d));
  115.  
  116.     return(d);
  117. }
  118.  
  119. static node_t
  120. create_node(string elem)
  121. {
  122.     struct _node_t *new_node = NULL;
  123.     new_node = malloc(sizeof(struct _node_t));
  124.     assert(new_node!=NULL);
  125.     new_node->elem = elem;
  126.     new_node->next = NULL;
  127.    
  128.     return(new_node);
  129. }
  130.  
  131. static node_t
  132. destroy_node(node_t killme)
  133. {
  134.     assert(killme != NULL);
  135.     killme->elem = string_destroy(killme->elem);
  136.     free(killme);
  137.     killme = NULL;
  138.  
  139.     return(killme);  
  140. }
  141.  
  142. dict_t
  143. dict_add(dict_t dict, string word, string def)
  144. {
  145.     assert(invrep(dict));
  146.     struct _node_t *new_node_w = NULL;
  147.     struct _node_t *new_node_d = NULL;
  148.     new_node_w = create_node(word);
  149.     new_node_d = create_node(def);
  150.     if(dict->size==0u)
  151.     {
  152.         dict->words = new_node_w;
  153.         dict->definitions = new_node_d;
  154.         dict->size = dict->size + 1u;
  155.     }
  156.     else
  157.     {
  158.         struct _node_t *sp_w = dict->words;
  159.         struct _node_t *sp_d = dict->definitions;
  160.         struct _node_t *prev_w = NULL;  
  161.         struct _node_t *prev_d = NULL;
  162.         while(sp_w->next != NULL && string_less(sp_w->elem, word))
  163.         {
  164.             prev_w = sp_w;
  165.             prev_d = sp_d;
  166.             sp_w = sp_w->next;
  167.             sp_d = sp_d->next;
  168.         }
  169.         if(string_eq(sp_w->elem, word))
  170.         {  
  171.             if(prev_w != NULL)
  172.             {
  173.               prev_w->next = new_node_w;
  174.               prev_d->next = new_node_d;
  175.             }
  176.             else
  177.             {
  178.               dict->words = new_node_w;
  179.               dict->definitions = new_node_d;
  180.             }
  181.             new_node_w->next = sp_w->next;
  182.             new_node_d->next = sp_d->next;
  183.             sp_d = destroy_node(sp_d);
  184.             sp_w = destroy_node(sp_w);
  185.         }
  186.         else if (string_less(sp_w->elem, word))
  187.         {
  188.             sp_d->next = new_node_d;
  189.             sp_w->next = new_node_w;
  190.             dict->size = dict->size +1u;
  191.         }
  192.         else
  193.         {
  194.             new_node_w->next = sp_w;
  195.             new_node_d->next = sp_d;
  196.             if(prev_w != NULL)
  197.             {
  198.                 prev_w->next = new_node_w;
  199.                 prev_d->next = new_node_d;
  200.             }
  201.             else
  202.             {
  203.                 dict->words = new_node_w;
  204.                 dict->definitions = new_node_d;
  205.             }
  206.             dict->size = dict->size + 1u;
  207.         }
  208.         sp_w = NULL;
  209.         sp_d = NULL;
  210.     }
  211.     assert(invrep(dict));
  212.        
  213.     return(dict);
  214. }
  215.  
  216. string
  217. dict_search(dict_t dict, string word)
  218. {
  219.     assert(invrep(dict));
  220.     struct _node_t *sp_w = dict->words;
  221.     struct _node_t *sp_d = dict->definitions;
  222.     string def = NULL;
  223.     bool res = false;
  224.     while(sp_w != NULL && !res)
  225.     {  
  226.         if(string_eq(word, sp_w->elem))
  227.         {
  228.             res = true;
  229.             def = sp_d->elem;
  230.         }
  231.         sp_w = sp_w->next;
  232.         sp_d = sp_d->next;
  233.     }
  234.     sp_d = NULL;
  235.     sp_w = NULL;
  236.     assert(invrep(dict)); // && dict_exists(dict, word));
  237.    
  238.     return(def);
  239. }
  240.  
  241. bool
  242. dict_exists(dict_t dict, string word)
  243. {
  244.     struct _node_t *sp_w = dict->words;
  245.     bool res = false;
  246.     while(sp_w != NULL && !res)
  247.     {
  248.         res = string_eq(sp_w->elem, word);
  249.         sp_w = sp_w->next;
  250.     }
  251.     sp_w = NULL;
  252.     assert(invrep(dict));
  253.  
  254.     return(res);
  255. }
  256.  
  257. unsigned int
  258. dict_length(dict_t dict)
  259. {  
  260.     assert(invrep(dict));
  261.  
  262.     return(dict->size);
  263. }
  264.  
  265. // removes the "index" element of the "list" list of nodes
  266. static node_t
  267. remove_on_index(node_t list, int index)
  268. {
  269.     node_t sp = list;
  270.     node_t prev = NULL;
  271.     int i = 0;
  272.     while(sp != NULL && i < index)
  273.     {  
  274.         prev = sp;
  275.         sp = sp->next;
  276.         i = i + 1;
  277.     }
  278.     if(prev != NULL)
  279.     {
  280.         prev->next = sp->next;
  281.         sp = destroy_node(sp);
  282.     }
  283.     else
  284.     {
  285.         list = sp->next;
  286.         sp = destroy_node(sp);
  287.     }
  288.     sp = NULL;
  289.  
  290.     return(list);
  291. }
  292.  
  293. dict_t
  294. dict_remove(dict_t dict, string word)
  295. {
  296.     assert(invrep(dict));
  297.     int index = find_index_of_key(dict, word);
  298.     if (index != -1)
  299.     {
  300.         dict->words = remove_on_index(dict->words, index);
  301.         dict->definitions = remove_on_index(dict->definitions, index);
  302.         dict->size--;
  303.   }
  304.   assert(invrep(dict));
  305.  
  306.   return(dict);
  307. }
  308.  
  309. dict_t
  310. dict_remove_all(dict_t dict)
  311. {  
  312.     assert(invrep(dict));
  313.     struct _node_t *sp_w = dict->words;
  314.     struct _node_t *sp_d = dict->definitions;
  315.     while(dict->words != NULL)
  316.     {
  317.         dict->words = dict->words->next;
  318.         dict->definitions = dict->definitions->next;
  319.         sp_w = destroy_node(sp_w);
  320.         sp_d = destroy_node(sp_d);
  321.         sp_w = dict->words;
  322.         sp_d = dict->definitions;
  323.         dict->size = dict->size - 1u;
  324.     }
  325.    
  326.     assert(invrep(dict) && dict_length(dict)==0u);
  327.  
  328.     return(dict);
  329. }
  330.  
  331. /* tip: use fprintf(file, "%s : %s\n", string_ref(word), string_ref(def));
  332.  * to save to file  */
  333.  
  334. void
  335. dict_dump(dict_t dict, FILE *file)
  336. {
  337.     assert(invrep(dict));
  338.     struct _node_t *sp_w = dict->words;
  339.     struct _node_t *sp_d = dict->definitions;
  340.     while(sp_w != NULL)
  341.     {
  342.         fprintf(file, "%s : %s\n", string_ref(sp_w->elem), string_ref(sp_d->elem));
  343.         sp_d = sp_d->next;
  344.         sp_w = sp_w->next;
  345.     }
  346.     assert(invrep(dict));
  347. }
  348.  
  349. dict_t
  350. dict_destroy(dict_t dict)
  351. {
  352.   dict = dict_remove_all(dict);
  353.   free(dict);
  354.   dict = NULL;
  355.  
  356.   return(dict);
  357. }
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement