Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct BinarySearchTree_t
- {
- char *mot,*def;
- struct BinarySearchTree_t *left;
- struct BinarySearchTree_t *right;
- };
- typedef struct BinarySearchTree_t BinarySearchTree;
- size_t findWordsByPrefix(BinarySearchTree* tree, char* prefix, char*** results)
- {
- BinarySearchTree *tmp;
- tmp=tree;
- static int size=0;
- if (!tmp)
- return 0;
- else if (strncmp(tmp->mot,prefix,strlen(prefix))==0)
- {
- (*results)= realloc(*results,(1+size)*sizeof(*(*results)));
- (*(*results+size))= malloc(strlen(tmp->mot)*sizeof(char));
- strcpy((*results)[size],tmp->mot);
- size++;
- return (1 + findWordsByPrefix(tmp->left,prefix, &results) + findWordsByPrefix(tmp->right,prefix, &results));
- }
- else
- return (strncmp(tmp->mot,prefix,strlen(prefix))<0)?findWordsByPrefix(tmp->right,prefix, &results):findWordsByPrefix(tmp->left,prefix, &results) ;
- }
- 1>binarysearchtree.c(98) : warning C4047: 'function' : 'char ***' differs in levels of indirection from 'char ****'
- 1>binarysearchtree.c(98) : warning C4024: 'findWordsByPrefix' : different types for formal and actual parameter 3
- malloc((strlen(tmp->mot) + 1 )*sizeof(char))
- struct ResultTable_t
- {
- int size;
- char **results;
- };
- typedef struct ResultTable_t ResultTable;
- void InitializeResults(ResultTable *p_table)
- {
- p_table->size = 0;
- p_table->results = NULL;
- }
- void AddResult(ResultTable *p_table, char *result)
- {
- if (result == NULL)
- return;
- p_table->size++;
- p_table->results = realloc(p_table->results, p_table->size * sizeof(*p_table->results));
- p_table->results[p_table->size-1] = malloc((strlen(result) + 1) * sizeof(**p_table->results));
- strcpy(p_table->results[p_table->size-1], result);
- }
- void FreeResults(ResultTable *p_table)
- {
- if (p_table->results != NULL)
- {
- int i;
- for (i = 0; i < p_table->size; i++)
- {
- free(p_table->results[i]);
- }
- free(p_table->results);
- }
- p_table->size = 0;
- p_table->results = NULL;
- }
- size_t findWordsByPrefix(BinarySearchTree* tree, char* prefix, ResultTable *p_table)
- {
- if (!tree)
- return 0;
- else if (strncmp(tree->mot,prefix,strlen(prefix))==0)
- {
- AddResult(p_table, tree->mot);
- return (1 + findWordsByPrefix(tree->left,prefix, p_table) + findWordsByPrefix(tree->right,prefix, p_table));
- }
- else if (strncmp(tree->mot,prefix,strlen(prefix))<0)
- {
- return findWordsByPrefix(tree->right,prefix, p_table);
- }
- else
- {
- return findWordsByPrefix(tree->left,prefix, p_table);
- }
- }
- ResultTable results;
- InitializeResults(&results);
- // Get some prefix to search for.
- char prefix = GetSomePrefix();
- int size = findWordsByPrefix(tree, prefix, &results);
- // Do something with the results
- // Free all memory of the results
- FreeResults(&results);
- void AddResult(char ***p_results, int *p_size, char *word)
- {
- if (word == NULL)
- return;
- (*p_size)++;
- (*p_results) = realloc(*p_results, ((*p_size)+1) * sizeof(**p_results));
- (*p_results)[(*p_size)-1] = malloc((strlen(word) + 1) * sizeof(***p_results));
- strcpy((*p_results)[(*p_size)-1], word);
- }
- void FreeResults(char ***p_results, int *p_size)
- {
- int i;
- if (p_results == NULL || *p_results == NULL)
- return;
- for (i = 0; i < (*p_size); i++)
- {
- free ((*p_results)[i]);
- }
- free (*p_results);
- *p_results = NULL;
- *p_size = 0;
- }
- size_t findWordsByPrefix(BinarySearchTree* tree, char* prefix, char ***p_results, int *p_size)
- {
- if (!tree)
- return 0;
- else if (strncmp(tree->mot,prefix,strlen(prefix))==0)
- {
- AddResult(p_results, p_size, tree->mot);
- return (1 + findWordsByPrefix(tree->left,prefix, p_results, p_size) + findWordsByPrefix(tree->right,prefix, p_results, p_size));
- }
- else if (strncmp(tree->mot,prefix,strlen(prefix))<0)
- {
- return findWordsByPrefix(tree->right,prefix, p_results, p_size);
- }
- else
- {
- return findWordsByPrefix(tree->left,prefix, p_results, p_size);
- }
- }
- char **results = NULL;
- int tablesize = 0;
- // Get some prefix to search for.
- char prefix = GetSomePrefix();
- int size = findWordsByPrefix(tree, prefix, &results, &tablesize);
- // Do something with the results
- // Free all memory of the results
- FreeResults(&results, &tablesize);
Add Comment
Please, Sign In to add comment