• Viernes 8 de Noviembre de 2024, 20:04

Autor Tema:  [Solucionado]Problemas con tabla hash  (Leído 2503 veces)

lambda

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
[Solucionado]Problemas con tabla hash
« en: Martes 17 de Mayo de 2011, 06:54 »
0
Tengo el problema de que al momento de almacenar la informacion en la tabla hash , y buscarla por medio de la funcion localizar  la cual devuelve el puntero devuelve "nil" cuando se supone que hay informacion.

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #define R 0.618034
  7. #define M 1024
  8.  
  9. //_______Estructuras de Datos____________//
  10. struct TipoTraduccion
  11. {
  12.     char espanol[20];
  13.     char ingles[20];
  14. };
  15. typedef struct TipoTraduccion Traduccion;
  16.  
  17. struct TipoElemento
  18. {
  19.     Traduccion traduccion;
  20.     struct TipoElemento *sgte;
  21. };
  22. typedef struct TipoElemento Elemento;
  23.  
  24. struct TipoTabla
  25. {
  26.    
  27.     Elemento* tabla[M];
  28.     int numElementos;
  29. };
  30. typedef struct TipoTabla TablaDispersa;
  31. //----------------------------------------//
  32. //_______Prototipos de funciones_________//
  33. long transformaClave(const char* clave);
  34. int dispersion(long x);
  35. void crearTabla(TablaDispersa* t);
  36. Elemento* crearNodo(Traduccion t);
  37. void crearTraduccion (TablaDispersa* t,Traduccion r);
  38. Elemento* localizar(TablaDispersa t, char spanish[20]);
  39. //---------------------------------------//
  40. //______Funcion Principal(Main)__________//
  41. int main(int argc, char **argv)
  42. {
  43.     Traduccion trad ;
  44.     TablaDispersa t;
  45.     crearTabla(&t);
  46.     int k;
  47.     while( k!= 2011)
  48.     {
  49.        
  50.         printf("nt  1.-  insertar traduccion");
  51.         printf("nt  2.-  buscar palabra");
  52.         printf("nt  3.-  Eliminar ");             /*Imprime el menu de opciones*/
  53.         printf("nntEsperando entrada del usuario >>> ");
  54.         scanf("%d",&k);
  55.         switch( k )
  56.         {
  57.             case 1:
  58.                 puts("Ingresa palabra en español");
  59.                 scanf("%s",trad.espanol);
  60.                 puts("Ingresa traduccion");
  61.                 scanf("%s",trad.ingles);
  62.                 crearTraduccion(&t,trad);
  63.                 break;
  64.             case 2:
  65.                 puts("Ingresa la palabra a traducir");
  66.                 scanf("%s",trad.espanol);
  67.                 printf("%p",localizar(t,trad.espanol));
  68.                
  69.                  break;
  70.            
  71.  
  72.             default:
  73.                  printf("nntLa opcion es incorrecta. Seleccione otra opcion...");
  74.                  getchar();
  75.                  break;
  76.              }
  77.         }
  78.     return 0;
  79. }
  80. //---------------------------------------//
  81.  
  82. //__________Funciones____________________//}
  83.  
  84. long transformaClave(const char* clave)
  85. {
  86.     int j;
  87.     long d;
  88.    
  89.     d=0;
  90.     for(j=0;j<strlen(clave);j++)
  91.     {
  92.         d =  d * 27 + clave[j];
  93.     }
  94.     if (d < 0){
  95.         d=-d;
  96.     }
  97.     return d;
  98. }
  99. int dispersion (long x)
  100. {
  101.     double t;
  102.     int v;
  103.     t=R * x - floor(R * x);
  104.     v = (int)M * t;
  105.     return v;
  106. }
  107. void crearTabla(TablaDispersa* t)
  108. {
  109.     for(int i=0; i<M ;i++)
  110.         t->tabla[i] = NULL;
  111.     t-> numElementos = 0;
  112.    
  113. }
  114. Elemento* crearNodo(Traduccion t)
  115. {
  116.     Elemento* n;
  117.     n = (Elemento*)malloc(sizeof(Elemento));
  118.     n-> traduccion = t;
  119.     n-> sgte = NULL;
  120.     return n;
  121. }
  122. void crearTraduccion (TablaDispersa* t,Traduccion r)
  123. {
  124.     int posicion;
  125.     Elemento* nuevo;
  126.     posicion = dispersion(transformaClave(r.espanol));
  127.     nuevo = crearNodo(r);
  128.     nuevo -> sgte = t -> tabla[posicion];
  129.     t -> tabla[posicion] = nuevo;
  130.     t -> numElementos++;
  131. }
  132. Elemento* localizar(TablaDispersa t, char spanish[20])
  133. {
  134.    
  135.     Elemento* p = NULL;
  136.     int posicion;
  137.     posicion = dispersion(transformaClave(spanish));
  138.     if (t.tabla[posicion])
  139.     {
  140.         p = t.tabla[posicion];
  141.         while((p -> sgte != NULL ) && p -> traduccion.espanol !=spanish)
  142.             p = p -> sgte;
  143.         if(p -> traduccion.espanol != spanish)
  144.                 p = NULL;
  145.     }
  146.     return p;
  147. }
  148.  
  149.  

El código es de un traductor de idiomas que al poner la opción de buscar pide la palabra a traducir y devuelve la direccion de memoria . El problema es que no se si implemente bien la tabla y si todo esta incorrecto.
« última modificación: Miércoles 18 de Mayo de 2011, 20:08 por lambda »

alexg88

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Problemas con tabla hash
« Respuesta #1 en: Miércoles 18 de Mayo de 2011, 13:05 »
0
La función localizar no debería devolver un puntero a un elemento, sino un  char *.

Luego, para comparar cadenas no puedes usar el operador == ni el != (eso compara direcciones de memoria en el caso de cadenas), sino la función strcmp.

Te paso el código corregido:

Código: C
  1.  
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #define R 0.618034
  8. #define M 1024
  9.  
  10. //_______Estructuras de Datos____________//
  11. struct TipoTraduccion
  12. {
  13.     char espanol[20];
  14.     char ingles[20];
  15. };
  16. typedef struct TipoTraduccion Traduccion;
  17.  
  18. struct TipoElemento
  19. {
  20.     Traduccion traduccion;
  21.     struct TipoElemento *sgte;
  22. };
  23. typedef struct TipoElemento Elemento;
  24.  
  25. struct TipoTabla
  26. {
  27.    
  28.     Elemento* tabla[M];
  29.     int numElementos;
  30. };
  31. typedef struct TipoTabla TablaDispersa;
  32. //----------------------------------------//
  33. //_______Prototipos de funciones_________//
  34. long transformaClave(const char* clave);
  35. int dispersion(long x);
  36. void crearTabla(TablaDispersa* t);
  37. Elemento* crearNodo(Traduccion t);
  38. void crearTraduccion (TablaDispersa* t,Traduccion r);
  39. char *localizar(TablaDispersa t, char spanish[20]);
  40. //---------------------------------------//
  41. //______Funcion Principal(Main)__________//
  42. int main(int argc, char **argv)
  43. {
  44.     Traduccion trad ;
  45.     TablaDispersa t;
  46.     crearTabla(&t);
  47.     int k=0;
  48.     while( k!= 2011)
  49.     {
  50.        
  51.         printf("nt  1.-  insertar traduccion");
  52.         printf("nt  2.-  buscar palabra");
  53.         printf("nt  3.-  Eliminar ");             /*Imprime el menu de opciones*/
  54.         printf("nntEsperando entrada del usuario >>> ");
  55.         scanf("%d",&k);
  56.         switch( k )
  57.         {
  58.             case 1:
  59.                 puts("Ingresa palabra en español");
  60.                 scanf("%s",trad.espanol);
  61.                 puts("Ingresa traduccion");
  62.                 scanf("%s",trad.ingles);
  63.                 crearTraduccion(&t,trad);
  64.                 break;
  65.             case 2:
  66.                 puts("Ingresa la palabra a traducir");
  67.                 scanf("%s",trad.espanol);
  68.                 printf("%s",localizar(t,trad.espanol));
  69.                
  70.                  break;
  71.            
  72.  
  73.             default:
  74.                  printf("nntLa opcion es incorrecta. Seleccione otra opcion...");
  75.                  getchar();
  76.                  break;
  77.              }
  78.         }
  79.     return 0;
  80. }
  81. //---------------------------------------//
  82.  
  83. //__________Funciones____________________//}
  84.  
  85. long transformaClave(const char* clave)
  86. {
  87.     int j;
  88.     long d;
  89.    
  90.     d=0;
  91.     for(j=0;j<strlen(clave);j++)
  92.     {
  93.         d =  d * 27 + clave[j];
  94.     }
  95.     if (d < 0){
  96.         d=-d;
  97.     }
  98.     return d;
  99. }
  100. int dispersion (long x)
  101. {
  102.     double t;
  103.     int v;
  104.     t=R * x - floor(R * x);
  105.     v = (int)M * t;
  106.     return v;
  107. }
  108. void crearTabla(TablaDispersa* t)
  109. {
  110.     for(int i=0; i<M ;i++)
  111.         t->tabla[i] = NULL;
  112.     t-> numElementos = 0;
  113.    
  114. }
  115. Elemento* crearNodo(Traduccion t)
  116. {
  117.     Elemento* n;
  118.     n = (Elemento*)malloc(sizeof(Elemento));
  119.     n-> traduccion = t;
  120.     n-> sgte = NULL;
  121.     return n;
  122. }
  123. void crearTraduccion (TablaDispersa* t,Traduccion r)
  124. {
  125.     int posicion;
  126.     Elemento* nuevo;
  127.     posicion = dispersion(transformaClave(r.espanol));
  128.     nuevo = crearNodo(r);
  129.     nuevo -> sgte = t -> tabla[posicion];
  130.     t -> tabla[posicion] = nuevo;
  131.     t -> numElementos++;
  132. }
  133. char *localizar(TablaDispersa t, char spanish[20])
  134. {
  135.    
  136.     Elemento* p = NULL;
  137.     int posicion;
  138.     posicion = dispersion(transformaClave(spanish));
  139.     if (t.tabla[posicion])
  140.     {
  141.         p = t.tabla[posicion];
  142.         while(strcmp(p->traduccion.espanol,spanish)!=0 && (p -> sgte != NULL ))
  143.             p = p -> sgte;
  144.         if(strcmp(p->traduccion.espanol,spanish)!=0)
  145.                 p = NULL;
  146.     }
  147.     return p->traduccion.ingles;
  148. }
  149.  
  150.  
  151.  
  152.  

lambda

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Problemas con tabla hash
« Respuesta #2 en: Miércoles 18 de Mayo de 2011, 20:07 »
0
Muchas gracias alexg88, de hecho ya habia corregido el problema, en si la función original es de tipo "Elemento*", y devuelve el apuntador de la traducción en la tabla. La volví void, para que en vez de devolver el apuntador, diera directamente la traduccion con un printf.
Muchisimas gracias por tu ayuda,en unos dias mas subire el codigo del proyecto y el proyecto entero, optimizado y con la capacidad de traducir en 3 idiomas. Espero algun dia ser un miembro activo de este grandioso foro.