Viernes 8 de Noviembre de 2024, 13:36
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
[Solucionado]Problemas con tabla hash
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: [Solucionado]Problemas con tabla hash (Leído 2500 veces)
lambda
Nuevo Miembro
Mensajes: 5
[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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define R 0.618034
#define M 1024
//_______Estructuras de Datos____________//
struct
TipoTraduccion
{
char
espanol
[
20
]
;
char
ingles
[
20
]
;
}
;
typedef
struct
TipoTraduccion Traduccion
;
struct
TipoElemento
{
Traduccion traduccion
;
struct
TipoElemento
*
sgte
;
}
;
typedef
struct
TipoElemento Elemento
;
struct
TipoTabla
{
Elemento
*
tabla
[
M
]
;
int
numElementos
;
}
;
typedef
struct
TipoTabla TablaDispersa
;
//----------------------------------------//
//_______Prototipos de funciones_________//
long
transformaClave
(
const
char
*
clave
)
;
int
dispersion
(
long
x
)
;
void
crearTabla
(
TablaDispersa
*
t
)
;
Elemento
*
crearNodo
(
Traduccion t
)
;
void
crearTraduccion
(
TablaDispersa
*
t
,
Traduccion r
)
;
Elemento
*
localizar
(
TablaDispersa t
,
char
spanish
[
20
]
)
;
//---------------------------------------//
//______Funcion Principal(Main)__________//
int
main
(
int
argc
,
char
**
argv
)
{
Traduccion trad
;
TablaDispersa t
;
crearTabla
(
&
t
)
;
int
k
;
while
(
k
!=
2011
)
{
printf
(
"nt 1.- insertar traduccion"
)
;
printf
(
"nt 2.- buscar palabra"
)
;
printf
(
"nt 3.- Eliminar "
)
;
/*Imprime el menu de opciones*/
printf
(
"nntEsperando entrada del usuario >>> "
)
;
scanf
(
"%d"
,&
k
)
;
switch
(
k
)
{
case
1
:
puts
(
"Ingresa palabra en español"
)
;
scanf
(
"%s"
,
trad.
espanol
)
;
puts
(
"Ingresa traduccion"
)
;
scanf
(
"%s"
,
trad.
ingles
)
;
crearTraduccion
(
&
t
,
trad
)
;
break
;
case
2
:
puts
(
"Ingresa la palabra a traducir"
)
;
scanf
(
"%s"
,
trad.
espanol
)
;
printf
(
"%p"
,
localizar
(
t
,
trad.
espanol
)
)
;
break
;
default
:
printf
(
"nntLa opcion es incorrecta. Seleccione otra opcion..."
)
;
getchar
(
)
;
break
;
}
}
return
0
;
}
//---------------------------------------//
//__________Funciones____________________//}
long
transformaClave
(
const
char
*
clave
)
{
int
j
;
long
d
;
d
=
0
;
for
(
j
=
0
;
j
<
strlen
(
clave
)
;
j
++
)
{
d
=
d
*
27
+
clave
[
j
]
;
}
if
(
d
<
0
)
{
d
=-
d
;
}
return
d
;
}
int
dispersion
(
long
x
)
{
double
t
;
int
v
;
t
=
R
*
x
-
floor
(
R
*
x
)
;
v
=
(
int
)
M
*
t
;
return
v
;
}
void
crearTabla
(
TablaDispersa
*
t
)
{
for
(
int
i
=
0
;
i
<
M
;
i
++
)
t
->
tabla
[
i
]
=
NULL
;
t
->
numElementos
=
0
;
}
Elemento
*
crearNodo
(
Traduccion t
)
{
Elemento
*
n
;
n
=
(
Elemento
*
)
malloc
(
sizeof
(
Elemento
)
)
;
n
->
traduccion
=
t
;
n
->
sgte
=
NULL
;
return
n
;
}
void
crearTraduccion
(
TablaDispersa
*
t
,
Traduccion r
)
{
int
posicion
;
Elemento
*
nuevo
;
posicion
=
dispersion
(
transformaClave
(
r.
espanol
)
)
;
nuevo
=
crearNodo
(
r
)
;
nuevo
->
sgte
=
t
->
tabla
[
posicion
]
;
t
->
tabla
[
posicion
]
=
nuevo
;
t
->
numElementos
++;
}
Elemento
*
localizar
(
TablaDispersa t
,
char
spanish
[
20
]
)
{
Elemento
*
p
=
NULL
;
int
posicion
;
posicion
=
dispersion
(
transformaClave
(
spanish
)
)
;
if
(
t.
tabla
[
posicion
]
)
{
p
=
t.
tabla
[
posicion
]
;
while
(
(
p
->
sgte
!=
NULL
)
&&
p
->
traduccion.
espanol
!=
spanish
)
p
=
p
->
sgte
;
if
(
p
->
traduccion.
espanol
!=
spanish
)
p
=
NULL
;
}
return
p
;
}
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.
Tweet
«
última modificación: Miércoles 18 de Mayo de 2011, 20:08 por lambda
»
alexg88
Miembro activo
Mensajes: 37
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define R 0.618034
#define M 1024
//_______Estructuras de Datos____________//
struct
TipoTraduccion
{
char
espanol
[
20
]
;
char
ingles
[
20
]
;
}
;
typedef
struct
TipoTraduccion Traduccion
;
struct
TipoElemento
{
Traduccion traduccion
;
struct
TipoElemento
*
sgte
;
}
;
typedef
struct
TipoElemento Elemento
;
struct
TipoTabla
{
Elemento
*
tabla
[
M
]
;
int
numElementos
;
}
;
typedef
struct
TipoTabla TablaDispersa
;
//----------------------------------------//
//_______Prototipos de funciones_________//
long
transformaClave
(
const
char
*
clave
)
;
int
dispersion
(
long
x
)
;
void
crearTabla
(
TablaDispersa
*
t
)
;
Elemento
*
crearNodo
(
Traduccion t
)
;
void
crearTraduccion
(
TablaDispersa
*
t
,
Traduccion r
)
;
char
*
localizar
(
TablaDispersa t
,
char
spanish
[
20
]
)
;
//---------------------------------------//
//______Funcion Principal(Main)__________//
int
main
(
int
argc
,
char
**
argv
)
{
Traduccion trad
;
TablaDispersa t
;
crearTabla
(
&
t
)
;
int
k
=
0
;
while
(
k
!=
2011
)
{
printf
(
"nt 1.- insertar traduccion"
)
;
printf
(
"nt 2.- buscar palabra"
)
;
printf
(
"nt 3.- Eliminar "
)
;
/*Imprime el menu de opciones*/
printf
(
"nntEsperando entrada del usuario >>> "
)
;
scanf
(
"%d"
,&
k
)
;
switch
(
k
)
{
case
1
:
puts
(
"Ingresa palabra en español"
)
;
scanf
(
"%s"
,
trad.
espanol
)
;
puts
(
"Ingresa traduccion"
)
;
scanf
(
"%s"
,
trad.
ingles
)
;
crearTraduccion
(
&
t
,
trad
)
;
break
;
case
2
:
puts
(
"Ingresa la palabra a traducir"
)
;
scanf
(
"%s"
,
trad.
espanol
)
;
printf
(
"%s"
,
localizar
(
t
,
trad.
espanol
)
)
;
break
;
default
:
printf
(
"nntLa opcion es incorrecta. Seleccione otra opcion..."
)
;
getchar
(
)
;
break
;
}
}
return
0
;
}
//---------------------------------------//
//__________Funciones____________________//}
long
transformaClave
(
const
char
*
clave
)
{
int
j
;
long
d
;
d
=
0
;
for
(
j
=
0
;
j
<
strlen
(
clave
)
;
j
++
)
{
d
=
d
*
27
+
clave
[
j
]
;
}
if
(
d
<
0
)
{
d
=-
d
;
}
return
d
;
}
int
dispersion
(
long
x
)
{
double
t
;
int
v
;
t
=
R
*
x
-
floor
(
R
*
x
)
;
v
=
(
int
)
M
*
t
;
return
v
;
}
void
crearTabla
(
TablaDispersa
*
t
)
{
for
(
int
i
=
0
;
i
<
M
;
i
++
)
t
->
tabla
[
i
]
=
NULL
;
t
->
numElementos
=
0
;
}
Elemento
*
crearNodo
(
Traduccion t
)
{
Elemento
*
n
;
n
=
(
Elemento
*
)
malloc
(
sizeof
(
Elemento
)
)
;
n
->
traduccion
=
t
;
n
->
sgte
=
NULL
;
return
n
;
}
void
crearTraduccion
(
TablaDispersa
*
t
,
Traduccion r
)
{
int
posicion
;
Elemento
*
nuevo
;
posicion
=
dispersion
(
transformaClave
(
r.
espanol
)
)
;
nuevo
=
crearNodo
(
r
)
;
nuevo
->
sgte
=
t
->
tabla
[
posicion
]
;
t
->
tabla
[
posicion
]
=
nuevo
;
t
->
numElementos
++;
}
char
*
localizar
(
TablaDispersa t
,
char
spanish
[
20
]
)
{
Elemento
*
p
=
NULL
;
int
posicion
;
posicion
=
dispersion
(
transformaClave
(
spanish
)
)
;
if
(
t.
tabla
[
posicion
]
)
{
p
=
t.
tabla
[
posicion
]
;
while
(
strcmp
(
p
->
traduccion.
espanol
,
spanish
)
!=
0
&&
(
p
->
sgte
!=
NULL
)
)
p
=
p
->
sgte
;
if
(
strcmp
(
p
->
traduccion.
espanol
,
spanish
)
!=
0
)
p
=
NULL
;
}
return
p
->
traduccion.
ingles
;
}
lambda
Nuevo Miembro
Mensajes: 5
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.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
[Solucionado]Problemas con tabla hash