elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema con recursividad + punteros + TRIE, PLAIN C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema con recursividad + punteros + TRIE, PLAIN C  (Leído 4,208 veces)
luisdr22

Desconectado Desconectado

Mensajes: 4


Ver Perfil
problema con recursividad + punteros + TRIE, PLAIN C
« en: 22 Octubre 2012, 19:32 pm »

buenas, estoy intentando de crear una especie de estructura trie en c... tengo la siguiente estructura

Código
  1. typedef struct
  2. {
  3. int hijo;// este es un bool de si tiene o no hijos
  4. int valor;//valor de la posicion
  5. struct Numero* hijo[101];//los hijos(son 101 porque estoy haciendo un trie de 100num)
  6. int existe;//si ya se proceso este hijo.. o si hay data adentro
  7. }Numero;
  8.  

que es lo que quiero hacer con esta estructura?
quiero todas las combinaciones que se hicieron en una base de datos...
de 3 numeros, de 2 numeros y de 1 numero... con numeros del 1-100..
lo que quiero es tomar las jugadas, agregarlas o aumentarle el valor guardado...

lo que hago es sacar los datos, los ordeno de menor a mayor, para que no aparescan permutaciones, solo combinaciones...

mi main tiene esto:
Código
  1. int main()
  2. {
  3. Numero temp[101];
  4. Numero *combinaciones=temp;
  5. int cn;//cantidad de numeros;
  6. scanf("%i",&cn);
  7. int tempi[cn+1];
  8. int c1;
  9. int c;
  10. int *numeros=tempi;
  11. for(c1=0;c1<cn;c1++)
  12. scanf("%i",&numeros[c1]);
  13. organizar(&numeros,cn);
  14. agregar(&(*combinaciones)[(*numeros)[0]],&numeros,1,cn,100);
  15. return 0;
  16. }

ok, les explico hasta aqui(que funciona):

tengo 5 numeros:
20 15 3 85 63

los organizo de menor a mayor:
3 15 20 63 85

quiero agregarla a el trie, entonces entro al arreglo
entro al metodo por el primero, en este el 3

el metodo recursivo es el siguiente:


Código
  1. void agregar(Numero* n,int* valores[],int posicion,int length,int monto)
  2. {
  3. //aqui termina la recursividad... cuando llego a la ultima posicion del arreglo
  4. if(posicion==length)
  5. {
  6. printf("agregado con exito");
  7. return;
  8. }
  9. //digo que ese hijo existe
  10. n->existe=1;
  11. //si no quedan mas hijos.. le sumo el monto que tengo
  12. if(length==posicion+1)
  13. n->valor+=monto;/
  14. else
  15. printf("agregando %i, avanzando por %i\n",*(valores)[posicion],posicion);
  16. system("PAUSE");
  17. /ese else es de prueba;
  18. posicion++;
  19. //aqui explota.. nose cual es la sintaxis para llamar a un hijo de mi trie...
  20. agregar(&((*n).(*hijo)[(*valores)[posicion]])),&(*valores),posicion,length,monto);
  21. //de manera corta les digo: quiero enviar a un metodo una structura puntero array....
  22. /*manera larga: el hijo N, tiene mas hijos (100), yo quiero entrar al numero que le toca,
  23. por ejemplo si yo entre por el 3, debe seguir al 15... entonces deberia enviar a n[15]...
  24. entonces esto explota y no encuentro nada como mejorar...
  25. si pueden ayudarme con esto( creo que me falta mas referencia o algo asi...*/
  26.  
  27. }
  28.  


//el metodo que uso de organizar es el siguiente:

Código
  1. void organizar(int* array[],int size)
  2. {
  3. int c;
  4. int c1;
  5. int temp;
  6. int temppos;
  7. for(c1=0;c1<size;c1++)
  8. {
  9.  temp=101;
  10.  for(c=c1;c<size;c++)
  11.  {
  12.  if (temp>(*array)[c])
  13.   {
  14.   temp=(*array)[c];
  15.   temppos=c;
  16.   }
  17.  }
  18.  (*array)[temppos]=(*array)[c1];
  19.  (*array)[c1]=temp;
  20. }
  21. for(c=0;c<size;c++)
  22. printf("%i ",(*array)[c]);
  23. }
  24.  
  25.  



gracias...


« Última modificación: 23 Octubre 2012, 16:46 pm por luisdr22 » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: problema con recursividad + punteros + TRIE, PLAIN C
« Respuesta #1 en: 23 Octubre 2012, 08:00 am »

¡Buenas!

Puedes porner el codigo dentro de las etiquetas de codigo? Estan en el deplegable GeSHi, sino es un coñazo leer el codigo tal cual lo has puesto, a parte de que unos corchetes con una i en medio es el formato de cursiva...

¡Saludos!


En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
luisdr22

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: problema con recursividad + punteros + TRIE, PLAIN C
« Respuesta #2 en: 23 Octubre 2012, 14:50 pm »

ya lo arregle :)
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: problema con recursividad + punteros + TRIE, PLAIN C
« Respuesta #3 en: 23 Octubre 2012, 15:59 pm »


Código
  1. agregar(&(*combinaciones)[(*numeros)[0]],&numeros,1,cn,100);
  2.  

Esto esta mal. numeros es de tipo int*, por lo tanto (*numeros) es de tipo int, y no puedes desplazar algo que no sea un puntero (a no ser que en este caso te deje por ser el desplazamiento nulo...)

Código
  1. agregar(&((*n).(*hijo)[(*valores)[posicion]])),&(*valores),posicion,length,monto);
  2.  

valores es un vector de punteros, (*valores) es el primer puntero, por lo tanto, al hacer (*valores)[posicion], estas desplazando posicion veces el primer puntero que contiene el vector valores. Y es mas que posible que estes apuntando a cualquier posicion de memoria, ya que el argumento original de la llamada (en main por lo menos) es un vector, y sus valores no son punteros, sino valores enteros que has introducido tu. Si quieres evitarte problemas, pasa simplemente cono parametro el vector, ya que el mismo identificador del vector es un puntero (constante) a la primera posicion, por lo que ya te aseguras el pasar el vector por "referencia"  y accedes directamente a sus distintos elementos mediante indices o por desplazamientos sobre el el origen...
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: problema con recursividad + punteros + TRIE, PLAIN C
« Respuesta #4 en: 23 Octubre 2012, 16:09 pm »

Apenas he leido nada, pero en el cuarto trozo de codigo tienes esta linea:
Código
  1. temp=999999999;
donde temp es una variable de tipo int, asi que ahi te estas saliendo del rango.

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
luisdr22

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: problema con recursividad + punteros + TRIE, PLAIN C
« Respuesta #5 en: 23 Octubre 2012, 16:34 pm »

Apenas he leido nada, pero en el cuarto trozo de codigo tienes esta linea:
Código
  1. temp=999999999;
donde temp es una variable de tipo int, asi que ahi te estas saliendo del rango.

Saludos.

sii fue un ejemplo... el programa solo tendra valores del 01-100, asi que es valido, pero gracias, voy arreglar eso
« Última modificación: 23 Octubre 2012, 16:46 pm por luisdr22 » En línea

luisdr22

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: problema con recursividad + punteros + TRIE, PLAIN C
« Respuesta #6 en: 23 Octubre 2012, 16:45 pm »

ok, gracias companero, no entendi algunas cosas o mejor dicho no conozco bien como trabajar bien con punteros, referencia, etc...


Código
  1. agregar(&(*combinaciones)[(*numeros)[0]],&numeros,1,cn,100);
  2.  

Esto esta mal. numeros es de tipo int*, por lo tanto (*numeros) es de tipo int, y no puedes desplazar algo que no sea un puntero (a no ser que en este caso te deje por ser el desplazamiento nulo...)

puedes decirme como uso int*, seria (**numeros)? o (numeros*)?
perdoname la ignoracia
Código
  1. agregar(&((*n).(*hijo)[(*valores)[posicion]])),&(*valores),posicion,length,monto);
  2.  

valores es un vector de punteros, (*valores) es el primer puntero, por lo tanto, al hacer (*valores)[posicion], estas desplazando posicion veces el primer puntero que contiene el vector valores. Y es mas que posible que estes apuntando a cualquier posicion de memoria, ya que el argumento original de la llamada (en main por lo menos) es un vector, y sus valores no son punteros, sino valores enteros que has introducido tu. Si quieres evitarte problemas, pasa simplemente cono parametro el vector, ya que el mismo identificador del vector es un puntero (constante) a la primera posicion, por lo que ya te aseguras el pasar el vector por "referencia"  y accedes directamente a sus distintos elementos mediante indices o por desplazamientos sobre el el origen...

aqui no entiendo bien que es lo que debo hacer.. debo no enviar valores por referencia? si no es mucho pedir puedes ponerme un ejemplo en codigo para ver..

mill gracias por la ayuda
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: problema con recursividad + punteros + TRIE, PLAIN C
« Respuesta #7 en: 23 Octubre 2012, 21:31 pm »

¡Buenas!

Ya veo que vas algo perdido con el tema de punteros. La verdad es que es un tema extenso. En el foro hay algunos textos explicando como funcionan, pero lo mejor que puedes hacer es pasarte por la sección de [Libros/Papers] y descargar algun libro. Te recomiendo el de como programar en C - C++ de Deitel & Deitel. Aunque la parte de C++ esta muy anticuada y ya no sigue los estandares, la parte de C es bastante completa. Si sigues el libro aprenderas rapido y bien, y sobre todo ten paciencia, no intentes ir mas deprisa de lo que tu cerebro pueda. No pases de tema hasta que mas o menos tengas asentadas las ideas.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error al intentar auth plain en SMTP
Dudas Generales
hechelion 2 4,921 Último mensaje 10 Mayo 2010, 15:03 pm
por mogukiller
Problema de recursividad
Java
lexoazul 6 4,669 Último mensaje 8 Febrero 2010, 22:31 pm
por lexoazul
problema de recursividad????
Java
optimus1007 1 2,628 Último mensaje 18 Marzo 2010, 17:46 pm
por Castiblanco
Duda con recursividad, punteros y parametros por dirección
Programación C/C++
jmrivas 3 2,663 Último mensaje 7 Julio 2014, 17:40 pm
por eferion
Problema con recursividad y buscaminas.
Programación C/C++
miguel0542 1 3,756 Último mensaje 5 Junio 2016, 23:49 pm
por do-while
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines