Closed mariu23 closed 4 months ago
La estructura es la correcta, para ahorrarte el for inicial, en vez de
new->vec = malloc(maxLevel*sizeof(struct elem));
for(int i = 0 ; i < maxLevel ; i++){
new->vec[i].vec = NULL;
new->vec[i].wordCount = 0;
}
podés hacer
new->vec = calloc(maxLevel, sizeof(struct elem));
En este for estás viendo si los punteros coinciden, no si la palabra está, deberías usar strcmp o strcasecmp
for(int j = 0 ; j < h->vec[level-1].wordCount ; j++){
if(h->vec[level-1].vec[j] == words[i]){
flag = 1;
}
}
y modularizaría un poco, haciendo que la verificación la haga una función auxiliar.
Ok, la funcion addWords
modularizada queda asi:
#define BLOCK 10
static int alreadyExists(char ** vec, int wordCount , char * s2){
for(int j = 0 ; j < wordCount ; j++){
if(strcasecmp(vec[j], s2) == 0){
return 1;
}
}
return 0;
}
int addWords(hangmanADT h, char * words[], unsigned int level){
if(h->maxLevel < level){
return -1;
}
int cantAdded = 0;
for(int i = 0 ; words[i] ; i++){
if(h->vec[level-1].wordCount % BLOCK == 0){
h->vec[level-1].vec = realloc(h->vec[level-1].vec, sizeof(char *) * (h->vec[level-1].wordCount + BLOCK));
}
if(!alreadyExists(h->vec[level-1].vec, h->vec[level-1].wordCount, words[i])){ //le paso el vector de punteros a char - debe iterar con ese vector
h->vec[level-1].vec[ h->vec[level-1].wordCount + i ] = words[i];
cantAdded++;
}
}
h->vec[level-1].wordCount += cantAdded;
return cantAdded;
}
Entonces esta bien "sacrificar" la eficiencia del addWords
(hacer que recorra el vector de palabras siempre que quiera agregar una nueva) para hacer que la funcion word
tenga acceso directo con un indice sacado al azar? Porque al ser un hangman la funcion words
se va a llamar muchas mas veces que la cantidad de palabras que se van a agregar, no?
Sí, es correcto. Y está bien hacer que addWord no sea tan eficiente, siempre y cuando eso permita que word sea eficiente ya que, como bien decís, se espera que una vez cargadas las palabras haya muchas consultas.
Hola, les mando mi solucion al ejercicio de hangmanADT (pasa el test).
hangmanADT.c
hangmanTest.c
Use un vector donde cada elemento representa un nivel, y es una estructura con un vector dinamico de palabras y la cantidad de palabras por nivel. Esto hace que la funcion
addWords
no sea eficiente, porque busca en el vector si la palabra que se quiere agregar ya existe, pero hace que sea facil acceder a una posicion al azar. Seria mejor hacer una lista para las palabras y mantenerlas ordenadas? Como el test da el ejemplo de que se pueden guardar con cualquier orden no estoy segura. Desde ya muchas gracias.