Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema método anterior lista ligada

Estas en el tema de Problema método anterior lista ligada en el foro de C/C++ en Foros del Web. Hola mi problema es que tengo este método anterior de mi lista ligada simple @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original template < class T > ...
  #1 (permalink)  
Antiguo 15/04/2014, 11:10
 
Fecha de Ingreso: febrero-2014
Mensajes: 12
Antigüedad: 10 años, 2 meses
Puntos: 0
Problema método anterior lista ligada

Hola mi problema es que tengo este método anterior de mi lista ligada simple

Código C++:
Ver original
  1. template <class T>
  2. nodo<T>* lista<T>::Anterior(nodo<T>* x)
  3. {
  4.    nodo<T> *anterior,*p;
  5.    anterior=p=primero;
  6.    if(x == primero){
  7.    return 0;
  8.    }else
  9.    {
  10.        while(p->getSiguiente() != NULL && p->getSiguiente() != x){
  11.             anterior=p;
  12.             p=p->getSiguiente();
  13.         }
  14.         return anterior;
  15.    }
  16. }

pero cuando lo pruebo y pido el anterior de un objeto siempre me da el primero y no entiendo porque, agradecería mucho su pronta respuesta.
  #2 (permalink)  
Antiguo 15/04/2014, 13:04
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema método anterior lista ligada

Creo que hay que preocuparse cuando x apunta a algo que no esta en la lista.
¿Que deberia retornar en ese caso y que es lo que retorna en realidad?
¿No sera que tienes a x apuntando a algo que no esta en la lista?
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 15/04/2014, 13:12
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Problema método anterior lista ligada

Hola:

Estas comparando los punteros nodo<T>* no los objetos.
Por cierto, para q esto funcione la clase T debe tener sobrecargado == y !=

slds;

nup_
  #4 (permalink)  
Antiguo 15/04/2014, 14:01
 
Fecha de Ingreso: febrero-2014
Mensajes: 12
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Problema método anterior lista ligada

Ya logre corregirlo, y estaba comparando posiciones no objetos por eso lo del puntero.

La verdad no se si sea por eso el problema pero lo unico que hice fue cambiar de linea la parte de

Código C++:
Ver original
  1. anterior = p;

y quitarle la parte de
Código C++:
Ver original
  1. p->getSiguiente() != NULL

y pues ya lo probé con varias funciones y no dio fallos si hace su función correcta.
Este es el nuevo código y cambie el nombre de la variable x por pos para que haya confusión en mi lista.

Código C++:
Ver original
  1. template <class T>
  2. nodo<T>* lista<T>::anterior(nodo<T> *pos){
  3.    nodo<T> *anterior,*p;
  4.    anterior=p=primero;
  5.    if(pos == primero){
  6.    return 0;
  7.    }else{
  8.        while(p->getSiguiente() != pos){
  9.             p=p->getSiguiente();
  10.             anterior=p;
  11.         }
  12.         return anterior;
  13.    }
  14. }

Y eso de preocuparme cuando x apunta a algo que no esta en la lista ya esta, lo que pasa es que utilizo un método de búsqueda que retorna la posición del puntero o nodo si lo encuentra de ahí la posición la mando por ejemplo al método anterior y como ya se que si existe por que el método buscar ya me lo dijo pues continuo con las funciones, es decir que si la posición no existe o apunta a otra cosa nunca entrare al método anterior.

Muchas gracias a todos los que tuvieron el tiempo de leer y a los que respondieron y quisiera pedir su ayuda ahora para que me ayuden a resolver el otro problema que tengo con la forma de ordenar una lista ya esta un tema abierto con esa duda.
  #5 (permalink)  
Antiguo 16/04/2014, 09:51
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Problema método anterior lista ligada

Hola:

Cita:
Iniciado por zaico77 Ver Mensaje
Y eso de preocuparme cuando x apunta a algo que no esta en la lista ya esta, lo que pasa es que utilizo un método de búsqueda que retorna la posición del puntero o nodo si lo encuentra de ahí la posición la mando por ejemplo al método anterior y como ya se que si existe por que el método buscar ya me lo dijo pues continuo con las funciones, es decir que si la posición no existe o apunta a otra cosa nunca entrare al método anterior.
Vale, pero eso no es una buena práctica. Si en algún momento te olvidas de eso y llamas esa función con un puntero q no existe en la lista vas a tener un "Access violation" en
Código C++:
Ver original
  1. p->getSiguiente()

Prueba con:
Código C++:
Ver original
  1. while(p->getSiguiente() != pos && p->getSiguiente() != NULL){
  2.             p=p->getSiguiente();
  3.             anterior=p;
  4. }
  5. return ( p->getSiguiente() != NULL ) ? anterior : 0;

Además es ineficiente. Cada vez q llamas la función anterior(...) tienes q recorrer la lista de nuevo.
Es mejor que en el método de búsqueda vayas llevando quien es el anterior o q uses otra estructura de datos: lista doblemente enlazada

slds;

nup_
  #6 (permalink)  
Antiguo 16/04/2014, 10:45
 
Fecha de Ingreso: febrero-2014
Mensajes: 12
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Problema método anterior lista ligada

Es muy cierto lo que dices y si acomodare mi código para que no me vaya a pasar ese tipo de error, y pues nos están enseñando ahora listas simples y si pienso lo mismo que tu, para que volver a recorrer todo desde el inicio?? pero pues así nos dijeron y ya dentro de 2 semanas empezare a ver listas ligadas dobles.

La verdad muchas gracias por tu tiempo y atención y no se si me podrías ayudar con el como ordenar mi lista, tengo otro tema abierto con esa pregunta y pues me urge un poco, aun no he encontrado algo que me oriente.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:23.