Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: freakfreckles en 7 Diciembre 2014, 22:51 pm



Título: Nodos y punteros, ayuda C++
Publicado por: freakfreckles en 7 Diciembre 2014, 22:51 pm
Buenas! Soy estudiante de computación y estoy trabada con algo a ver si me pueden ayudar! Estoy usando el codeblocks en linux
tengo una galería de imagenes construida por nodos, y tengo que poder agregar una imagen, votarla y ordenarla por orden de llegada y por votos
Ya cuento con la galeria ordenada hasta que agrego una nueva imagen, y mi misión es votarla y ordenarla en el resto de la lista. Lo que me está complicando es el intercambio del nodo desordenado con el nuevo lugar. Ya que no puedo usar swap simplemente. Debería arreglar los punteros de los nodos manualmente. No se si se entiende, les paso mi estructura del Nodo y las funciones. El error que me sale es "segmentation fault" y no me deja verificar si lo que hice esta bien, agradecería su ayuda.

Código
  1. struct Nodo {
  2. Imagen elemento;
  3. Nodo* sigLlegada;
  4. Nodo* sigVotos;
  5. int votos;
  6. };
  7.  
  8. class Lista {
  9. public:
  10. Nodo* prmLlegada;
  11. Nodo* prmVotos;
  12. };
  13. void GaleriaImagenes::agregarImagen(const Imagen &imagen) {
  14.  
  15. Nodo* nuevo = new Nodo;
  16. nuevo -> elemento = imagen;
  17. nuevo -> sigLlegada = NULL;
  18. nuevo -> sigVotos = NULL;
  19. nuevo -> votos = 0;
  20.  
  21. if(imagenes.prmLlegada == NULL){
  22. imagenes.prmLlegada = nuevo;
  23. }
  24. else{
  25. Nodo* i = imagenes.prmLlegada;
  26. Nodo* j = imagenes.prmVotos;
  27.  
  28. while( i -> sigLlegada != NULL){
  29. i = i -> sigLlegada;
  30. }
  31. i -> sigLlegada = nuevo;
  32. while( j -> sigVotos != NULL){
  33. j = j -> sigVotos;
  34. }
  35. j -> sigVotos = nuevo;
  36. }
  37. }
  38.  
  39. void GaleriaImagenes::votar(const Imagen &imagen) {
  40. Nodo* i = imagenes.prmVotos;
  41. while (!(i -> elemento == imagen)){
  42. i = i -> sigVotos;
  43. }
  44. i -> votos = i -> votos + 1;
  45. Nodo* k = i -> sigVotos;
  46. while(k -> votos == i -> votos - 1){
  47. k = k -> sigVotos;
  48. }
  49.   Nodo* j = k;
  50.    k = i-> sigVotos;
  51.    i= j -> sigVotos;
  52.  
  53. }


Título: Re: Nodos y punteros, ayuda C++
Publicado por: eferion en 9 Diciembre 2014, 12:04 pm
Código
  1. if(imagenes.prmLlegada == NULL){
  2. imagenes.prmLlegada = nuevo;
  3. }
  4. else{
  5. Nodo* i = imagenes.prmLlegada;
  6. Nodo* j = imagenes.prmVotos;
  7.  

supongo que si "imagenes.prmLlegada == NULL", entonces "imagenes.prmVotos" será igualmente NULL, no? No puedo saberlo a ciencia cierta porque no has puesto el código necesario para ello. Pero bueno, sigo a lo mío. El caso es que este segundo puntero no lo actualizas debidamente, sin embargo después, a la hora de insertar la segunda imagen, haces tranquilamente "Nodo* j = imagenes.prmVotos;" y manipulas ese puntero como si estuviese apuntando a un elemento válido.


Título: Re: Nodos y punteros, ayuda C++
Publicado por: freakfreckles en 10 Diciembre 2014, 17:14 pm
Hola eferion muchas gracias por tu respuesta! Sí, lo que vos decis tiene sentido. Al ser el Nodo primero, si es null imagenes.prmLlegada y imagenes.prmVotos también son null.
Con tu comentario, arreglé la función agregarImagen y lo solucioné así:

Código
  1. void GaleriaImagenes::agregarImagen(const Imagen &imagen) {
  2.  
  3.    Nodo* nuevo = new Nodo;
  4.    nuevo -> elemento = imagen;
  5.    nuevo -> sigLlegada = NULL;
  6.    nuevo -> sigVotos = NULL;
  7.    nuevo -> votos = 0;
  8.  
  9.    if(imagenes.prmLlegada == NULL || imagenes.prmVotos == NULL){
  10.        imagenes.prmLlegada = nuevo;
  11.        imagenes.prmVotos== nuevo;
  12.    }
  13.    else{
  14.        Nodo* i = imagenes.prmLlegada;
  15.        Nodo* j = imagenes.prmVotos;
  16.  
  17.        while( i -> sigLlegada != NULL){
  18.            i = i -> sigLlegada;
  19.        }
  20.        i -> sigLlegada = nuevo;
  21.        while( j -> sigVotos != NULL){
  22.            j = j -> sigVotos;
  23.        }
  24.        j -> sigVotos = nuevo;
  25.    }
  26. }


Me sigue tirando segmentation Fault, pero al menos no en esa función. Muchas gracias,
Ahora me dice en la función Votar:

Código
  1. void GaleriaImagenes::votar(const Imagen &imagen) {
  2.    Nodo* i = imagenes.prmVotos;
  3.   while (!(i -> elemento == imagen)){
  4.        i = i -> sigVotos;
  5.        }
  6.    i-> votos = i -> votos + 1;
  7.   Nodo* k = i -> sigVotos;
  8.    while(k -> votos == i -> votos - 1){
  9.        k = k -> sigVotos;
  10.        }
  11.    Nodo* j = k;
  12.    k = i-> sigVotos;
  13.    i= j -> sigVotos;
  14.    }

Lo que hace el primer while es buscar la imagen, y cuando la encuentro sumarle un voto. Y después quiero intercambiar ese voto desordenado con el último voto de la lista que tenia el valor del voto antes de ser votado. Ya que no puedo usar swap por el tema de arreglar los punteros, lo hice manual. Pero me sigue dando segmentation fault. Alguna idea?

Muchas gracias!