Guest User

Untitled

a guest
Jan 23rd, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. struct BinarySearchTree_t
  2. {
  3. char *mot,*def;
  4. struct BinarySearchTree_t *left;
  5. struct BinarySearchTree_t *right;
  6. };
  7. typedef struct BinarySearchTree_t BinarySearchTree;
  8.  
  9. size_t findWordsByPrefix(BinarySearchTree* tree, char* prefix, char*** results)
  10. {
  11. BinarySearchTree *tmp;
  12. tmp=tree;
  13.  
  14. static int size=0;
  15.  
  16. if (!tmp)
  17. return 0;
  18. else if (strncmp(tmp->mot,prefix,strlen(prefix))==0)
  19. {
  20.  
  21. (*results)= realloc(*results,(1+size)*sizeof(*(*results)));
  22. (*(*results+size))= malloc(strlen(tmp->mot)*sizeof(char));
  23. strcpy((*results)[size],tmp->mot);
  24. size++;
  25. return (1 + findWordsByPrefix(tmp->left,prefix, &results) + findWordsByPrefix(tmp->right,prefix, &results));
  26. }
  27. else
  28. return (strncmp(tmp->mot,prefix,strlen(prefix))<0)?findWordsByPrefix(tmp->right,prefix, &results):findWordsByPrefix(tmp->left,prefix, &results) ;
  29. }
  30.  
  31. 1>binarysearchtree.c(98) : warning C4047: 'function' : 'char ***' differs in levels of indirection from 'char ****'
  32. 1>binarysearchtree.c(98) : warning C4024: 'findWordsByPrefix' : different types for formal and actual parameter 3
  33.  
  34. malloc((strlen(tmp->mot) + 1 )*sizeof(char))
  35.  
  36. struct ResultTable_t
  37. {
  38. int size;
  39. char **results;
  40. };
  41.  
  42. typedef struct ResultTable_t ResultTable;
  43.  
  44. void InitializeResults(ResultTable *p_table)
  45. {
  46. p_table->size = 0;
  47. p_table->results = NULL;
  48. }
  49.  
  50. void AddResult(ResultTable *p_table, char *result)
  51. {
  52. if (result == NULL)
  53. return;
  54. p_table->size++;
  55. p_table->results = realloc(p_table->results, p_table->size * sizeof(*p_table->results));
  56. p_table->results[p_table->size-1] = malloc((strlen(result) + 1) * sizeof(**p_table->results));
  57. strcpy(p_table->results[p_table->size-1], result);
  58. }
  59.  
  60. void FreeResults(ResultTable *p_table)
  61. {
  62. if (p_table->results != NULL)
  63. {
  64. int i;
  65.  
  66. for (i = 0; i < p_table->size; i++)
  67. {
  68. free(p_table->results[i]);
  69. }
  70. free(p_table->results);
  71. }
  72. p_table->size = 0;
  73. p_table->results = NULL;
  74. }
  75.  
  76. size_t findWordsByPrefix(BinarySearchTree* tree, char* prefix, ResultTable *p_table)
  77. {
  78. if (!tree)
  79. return 0;
  80. else if (strncmp(tree->mot,prefix,strlen(prefix))==0)
  81. {
  82. AddResult(p_table, tree->mot);
  83. return (1 + findWordsByPrefix(tree->left,prefix, p_table) + findWordsByPrefix(tree->right,prefix, p_table));
  84. }
  85. else if (strncmp(tree->mot,prefix,strlen(prefix))<0)
  86. {
  87. return findWordsByPrefix(tree->right,prefix, p_table);
  88. }
  89. else
  90. {
  91. return findWordsByPrefix(tree->left,prefix, p_table);
  92. }
  93. }
  94.  
  95. ResultTable results;
  96.  
  97. InitializeResults(&results);
  98.  
  99. // Get some prefix to search for.
  100. char prefix = GetSomePrefix();
  101.  
  102. int size = findWordsByPrefix(tree, prefix, &results);
  103.  
  104. // Do something with the results
  105.  
  106. // Free all memory of the results
  107.  
  108. FreeResults(&results);
  109.  
  110. void AddResult(char ***p_results, int *p_size, char *word)
  111. {
  112. if (word == NULL)
  113. return;
  114. (*p_size)++;
  115. (*p_results) = realloc(*p_results, ((*p_size)+1) * sizeof(**p_results));
  116. (*p_results)[(*p_size)-1] = malloc((strlen(word) + 1) * sizeof(***p_results));
  117. strcpy((*p_results)[(*p_size)-1], word);
  118. }
  119.  
  120. void FreeResults(char ***p_results, int *p_size)
  121. {
  122. int i;
  123.  
  124. if (p_results == NULL || *p_results == NULL)
  125. return;
  126.  
  127. for (i = 0; i < (*p_size); i++)
  128. {
  129. free ((*p_results)[i]);
  130. }
  131. free (*p_results);
  132.  
  133. *p_results = NULL;
  134. *p_size = 0;
  135. }
  136.  
  137. size_t findWordsByPrefix(BinarySearchTree* tree, char* prefix, char ***p_results, int *p_size)
  138. {
  139. if (!tree)
  140. return 0;
  141. else if (strncmp(tree->mot,prefix,strlen(prefix))==0)
  142. {
  143. AddResult(p_results, p_size, tree->mot);
  144. return (1 + findWordsByPrefix(tree->left,prefix, p_results, p_size) + findWordsByPrefix(tree->right,prefix, p_results, p_size));
  145. }
  146. else if (strncmp(tree->mot,prefix,strlen(prefix))<0)
  147. {
  148. return findWordsByPrefix(tree->right,prefix, p_results, p_size);
  149. }
  150. else
  151. {
  152. return findWordsByPrefix(tree->left,prefix, p_results, p_size);
  153. }
  154. }
  155.  
  156. char **results = NULL;
  157. int tablesize = 0;
  158.  
  159. // Get some prefix to search for.
  160. char prefix = GetSomePrefix();
  161.  
  162. int size = findWordsByPrefix(tree, prefix, &results, &tablesize);
  163.  
  164. // Do something with the results
  165.  
  166. // Free all memory of the results
  167.  
  168. FreeResults(&results, &tablesize);
Add Comment
Please, Sign In to add comment