Foro de elhacker.net

Programación => Java => Mensaje iniciado por: monsefoster en 29 Enero 2010, 08:43 am



Título: Eliminar nodo de lista?
Publicado por: monsefoster en 29 Enero 2010, 08:43 am
Hola chicos, necesito "aprender" como eliminar un nodo de una lista...tengo un libro pero no entiendo nada  :huh:

Tengo que hacerle un menu, pero no hay problema...eso no tengo problema, la cosa es que no se como eliminar el nodo...estoy conciente de lo que tengo que hacer, pero no se como hacerlo en la pc  :huh:, me ayudan por favor?

lo que tengo y se que lo que estoy tratando de hacer con eliminar esta mal:

Código
  1. import paquete.*;
  2. import java.io.*;
  3. public class principal {
  4.  
  5. public static void main(String[] args) throws IOException{
  6. String r;
  7. numero n;
  8. int valor;
  9. lista L = new lista ();
  10. do{
  11. valor=(int)(99*Math.random()+1);
  12. n=new numero (valor);
  13. L.agregar(n);
  14. System.out.print ("Agregar otro Nro?: ");
  15. r=en.readLine();
  16. r=r.toUpperCase();
  17. }while (r.equals ("S"));
  18. System.out.println ("Mostrar Lista: ");
  19. L.mostrar();
  20. do{
  21. System.out.println ("Valor a buscar: ");
  22. valor = Integer.parseInt(en.readLine());
  23. L.buscar(valor);
  24. System.out.print ("Desea hacer otra busqueda S/N: ");
  25. r=en.readLine ();
  26. r=r.toUpperCase();
  27. }while (r.equals("S"));
  28. do{
  29. System.out.println ("Eliminar numero en la posicion: ");
  30. valor = Integer.parseInt(en.readLine());
  31. L.eliminar();
  32. L.mostrar();
  33. System.out.println ("Desea Eliminar otro objeto: ");
  34. r=en.readLine();
  35. r=r.toUpperCase();
  36. }while (r.equals ("S"));
  37. }
  38. }

Código
  1. package paquete;
  2.  
  3.  
  4. public class numero {
  5. private int num;
  6. private numero sig;
  7.  
  8. public numero(int x) {
  9. num=x;
  10. sig=null;
  11. }
  12. public int retx(){
  13. return num;
  14. }
  15. public numero retsig(){
  16. return sig;
  17. }
  18. public void setsig(numero n){
  19. sig=n;
  20. }
  21. }

Código
  1. package paquete;
  2.  
  3. public class lista {
  4. private numero i;
  5.  
  6. public lista() {
  7. i=null;
  8. }
  9. public void agregar (numero n){
  10. if (i==null){
  11. i=n;
  12. }
  13. else{
  14. n.setsig(i);
  15. i=n;
  16. }
  17. }
  18. public void mostrar(){
  19. numero t=i;
  20. if (i!=null){
  21. while (t!=null){
  22. System.out.print(t.retx()+" ");
  23. t=t.retsig();
  24. }
  25. }
  26. else{
  27. System.out.println ("Lista Vacia");
  28. }
  29.  
  30. }
  31. public void buscar (int x){
  32. numero t=i;
  33. int pos=1;
  34. if (i!=null){
  35. while (t!=null){
  36. if (t.retx()==x){
  37. System.out.println ("El numero: "+x+" esta en la posicion "+pos+ " de la lista");
  38. break;
  39. }
  40. t=t.retsig();
  41. pos++;
  42. }
  43. if (t==null)
  44. System.out.println ("El numero "+x+" no esta en la lista");
  45. }
  46. }
  47. public lista eliminar (int n){
  48. int pos=1;
  49. numero t=i;
  50. if (t!=null){
  51. if (pos==n){
  52. while (pos=n){
  53. }
  54. t=t.setsig();
  55. }
  56. else{
  57. pos++;
  58. }
  59. }
  60.  
  61. }
  62. }

Agradeceria la ayuda inmensamente, lei algo de un nodo inicial, y anterior...la otra cosa es que no se como referenciar nodos de una lista...probablemente por eso se me hace tan dificil....

Lo que quiero hacer es que el usuario de la posicion del nodo que quiere eliminar y este se elimine... :huh:


Título: Re: Eliminar nodo de lista?
Publicado por: egyware en 29 Enero 2010, 15:25 pm
Hola, excelente hiciste la lista de nodos tu mismo pero no sabes como eliminar la lista, te voy a dar el algoritmo.

Como es una lista de nodos simplemente enlazados, debes encontrar el nodo anterior a borrar y cuando lo encuentres debes hacer esto.
//BorrarNodo
Nodo anterior; //Nodo anterior al valor a borrar
Nodo borrar; //Nodo a borrar
borrar <- anterior.siguiente;
anterior.siguiente <- anterior.siguiente.siguiente;
Y con eso lo borrar ahora para buscarlo
Debes tener precaución que la lista no este vacia y que el siguiente no sea nulo.

Nodo nodo;
valorBorrar <- 18;
si nodo.siguiente != nulo entonces
 si nodo.siguiente.valor =  valorBorrar entonces
    borrarNodo
 final si
final si

Es mas o menos asi  :rolleyes:
Saludo





Título: Re: Eliminar nodo de lista?
Publicado por: monsefoster en 30 Enero 2010, 23:10 pm
Sinceramente no tengo idea de como hacerlo...
Lo que esta alli lo hizo el prof en la practica... y pretende ponerlo para el examen...

Intente hacer algo pero no estoy ni cerca...
No tengo idea de como se guarda la lista en memoria...no se como acceder a cada uno de los elementos de esta y eso me complica...

no es como un arreglo que con v[0] se que tengo el primer elemento del arreglo... y esta todo puesto bajo v, donde cada [] indica la direccion de memoria donde esta ese elemento...

lo de la posicion no es dificil, pues ya lo hice antes, pero no entiendo como se supone que debo borrar el nodo... Lo que me dijiste, ya lo tengo en el libro y sigo entiendiendo nada  :huh:







Título: Re: Eliminar nodo de lista?
Publicado por: Debci en 30 Enero 2010, 23:21 pm
Sinceramente no tengo idea de como hacerlo...
Lo que esta alli lo hizo el prof en la practica... y pretende ponerlo para el examen...

Intente hacer algo pero no estoy ni cerca...
No tengo idea de como se guarda la lista en memoria...no se como acceder a cada uno de los elementos de esta y eso me complica...

no es como un arreglo que con v[0] se que tengo el primer elemento del arreglo... y esta todo puesto bajo v, donde cada [] indica la direccion de memoria donde esta ese elemento...

lo de la posicion no es dificil, pues ya lo hice antes, pero no entiendo como se supone que debo borrar el nodo... Lo que me dijiste, ya lo tengo en el libro y sigo entiendiendo nada  :huh:






Intenta guardar esa lista en un archivo de texto y modificarlo desde este, osea tu lo parseas, todos los nodos a xml y luego organizas, eliminas e incluse les das id para clasficarlos correctamente.

Saludos


Título: Re: Eliminar nodo de lista?
Publicado por: egyware en 30 Enero 2010, 23:26 pm
 :rolleyes:
Para acceder a la lista es facil
Código
  1. public class Nodo{
  2.  int value;
  3.  Nodo next;
  4. }
  5. //Por ahi
  6. Nodo aux = lista;
  7. while(aux != null){
  8.    Sytem.out.println(aux.next);
  9.    aux = aux.next;
  10. //Para que paresca como arreglo
  11. aux = lista
  12. for(int i;aux!=null;i++){
  13.    Sytem.out.println("lista["+i+"]="+aux.next);
  14.    aux = aux.next;
  15. }
  16. }

Saludos

PS:
Intenta guardar esa lista en un archivo de texto y modificarlo desde este, osea tu lo parseas, todos los nodos a xml y luego organizas, eliminas e incluse les das id para clasficarlos correctamente.

Saludos

Estas matando una mosca con un cañon hombre es mas facil como crees.


Título: Re: Eliminar nodo de lista?
Publicado por: Debci en 30 Enero 2010, 23:34 pm
:rolleyes:
Para acceder a la lista es facil
Código
  1. public class Nodo{
  2.  int value;
  3.  Nodo next;
  4. }
  5. //Por ahi
  6. Nodo aux = lista;
  7. while(aux != null){
  8.    Sytem.out.println(aux.next);
  9.    aux = aux.next;
  10. //Para que paresca como arreglo
  11. aux = lista
  12. for(int i;aux!=null;i++){
  13.    Sytem.out.println("lista["+i+"]="+aux.next);
  14.    aux = aux.next;
  15. }
  16. }

Saludos

PS:
Intenta guardar esa lista en un archivo de texto y modificarlo desde este, osea tu lo parseas, todos los nodos a xml y luego organizas, eliminas e incluse les das id para clasficarlos correctamente.

Saludos

Estas matando una mosca con un cañon hombre es mas facil como crees.
Que tiene de dificil? Enserio, no le veo complicación.

Saludos


Título: Re: Eliminar nodo de lista?
Publicado por: egyware en 30 Enero 2010, 23:59 pm
Me referias pasarlo a XML eso seria matar una mosca con un cañon.


Título: Re: Eliminar nodo de lista?
Publicado por: monsefoster en 31 Enero 2010, 01:40 am
Sigo sin entender pero nada... y lo peor que no soy la unica, alguien mas de mi clase entro y vio mi post y quedamos igual..  :huh:

No entiendo a quien se le ocurre, dar una sola clase, y pretender ponerlo en la prueba, sin tener otra oportunidad para preguntar!


Título: Re: Eliminar nodo de lista?
Publicado por: egyware en 31 Enero 2010, 02:41 am
Me recuerda lo que paso a mis compañeros, el profe paso una clase y evaluo de inmediato, gracias que yo sabia java de antes y que hice para remediarlo les enseñe  ;D
Bucha yo no quiero darte la solucion al problema aunque me la se mas bien quiero que aprendas.
Primero hay que hacer el algoritmo que recorra toda la lista

Código
  1. public class Nodo{
  2. public  int value;
  3. public Nodo next;
  4. }
  5. //En el main
  6. int buscar = 10;//por colocarle :P
  7. Nodo lista = ...
  8. Nodo aux = lista;
  9. //revisar el primer nodo
  10. if(aux.value== buscar){
  11.  aux = aux.next; //Corro el puntero hacia el siguiente desenlazando
  12.  lista = aux;
  13. }else
  14. while(aux!=null){
  15.   if(aux.next!=NULL){
  16.     if(aux.next.value == buscar){
  17.          //¡¡¡Encontrado!!!! vea anexo XD
  18.     }
  19.   }
  20. }
  21.  

Espera que te hare un dibujito pero mas o menos tienes que tener esto para eliminar
Edit:
Bueno como ya has visto el bucle anterior y que reclama L-EYER tu debes saberlo pero para encontrar el nodo anterior.
Mira en la figura 1) es una representacion grafica, los numeros corresponde a value y las flechas a next que es que apunta a la siguiente clase (igual como los punteros de C)
(http://anubis.inf.udec.cl/~egyware/imagenes/explicacionBorrarNodo.jpg)
En la figura 2) como queremos borrar el numero 5 entonces con el bucle anterior buscamos el nodo anterior el cual es 4.
En la figura 3) que lo que hacemos es sacar 5 de la lista para eso hacemos que 4 apunte al  al siguiente 5, osea siguiente siguiente de 4. En nuestro algoritmo quedará anterior.siguiente = anterior.siguiente.siguiente
En la figura 3.a) se ve que el nodo que desenlazamos todavia apunta a parte de la lista entonces hacemos que apunte a null para definitivamente sacarlo en la figura 3.b) queda solito :)  para borrarlo de la memoria pero como es Java basta con perder toda referencia al puntero para que se valla a la basura (Garbage Colector de Java en caso de C/C++ free/delete).
Esto es valido tanto como C/C++, Java o lenguaje preferentemente que use punteros.
Tu algoritmo de borrado en Java quedaria asi continuando con lo que te deje
Código
  1. //Anexo XD
  2. //Aqui se ve como la fig 2)
  3. Nodo borrar = aux.next; //Guardamos el nodo
  4. aux.next = aux.next.next; //anterior.siguiente = anterior.siguiente.siguiente  fig 3) ;)
  5. //todavia el valor a sacar queda apuntando a parte de la lista
  6. borrar.next = null; //Con esto queda como fig 3.b)

Bueno eso seria saludos


Título: Re: Eliminar nodo de lista?
Publicado por: Leyer en 31 Enero 2010, 02:50 am
obviamente eso ya lo tiene :xD lo que no sabe es como eliminarlo

PD: pregunto lo hiciste tu o ses algo que te dio el prof por que la solucuion seria y por que no usas un generico  class Lista<T> {}


Título: Re: Eliminar nodo de lista?
Publicado por: egyware en 31 Enero 2010, 02:56 am
L-Eyer no seas impaciente ademas no quiero darle la tarea hecha si se la doy hecha le ira mal en el certamen  >:(


Título: Re: Eliminar nodo de lista?
Publicado por: Leyer en 31 Enero 2010, 03:09 am
 ;D


Título: Re: Eliminar nodo de lista?
Publicado por: egyware en 31 Enero 2010, 03:15 am
Ahi te deje la respuesta dentro del mismo hilo unos cuantos post antes espero que te sirva y aprendas como hacerlos, sinceramente los nodos de C son mas faciles de comprende que java porque la mayoria cree que Java no existen los punteros y realmente los objetos de java son punteros  :laugh:
http://foro.elhacker.net/java/eliminar_nodo_de_lista-t282749.0.html;msg1395878#msg1395878

Saludos


Título: Re: Eliminar nodo de lista?
Publicado por: monsefoster en 9 Febrero 2010, 02:01 am
Y continuo con lo del nodo...
lo estoy haciendo mal probablemente...

Código
  1. public void eliminar (numero x){
  2. numero t=i;
  3. numero ant=x.sig;
  4. ant.sig=t.sig;
  5. if (i!=null){
  6. while (t!=null){
  7. if (t.retx()==x.num){
  8. ant.sig=t.sig;
  9. }
  10. t=t.retsig();
  11. ant.sig=t.sig;
  12.  
  13. }
  14. }
  15. }

Ayuda!  :huh:


Título: Re: Eliminar nodo de lista?
Publicado por: Leyer en 9 Febrero 2010, 22:15 pm
y si le colocas al numero un 0 en ves de null y que al mostrar la lista practicamente ese numero este eliminado?

Un Saludo!


Título: Re: Eliminar nodo de lista?
Publicado por: monsefoster en 10 Febrero 2010, 03:02 am
No entendi muy bien lo que quisiste decir...

 :huh:


Título: Re: Eliminar nodo de lista?
Publicado por: Leyer en 10 Febrero 2010, 03:09 am
ni yo puedo aplicar lo que dijo egyware suena facil decirlo pero hacerlo en el code puff :¬¬ yo estuve viendo pero no le entendi pero nada :xD

Código
  1. Agregar otro Nro?: s
  2. Agregar otro Nro?: s
  3. Agregar otro Nro?: s
  4. Agregar otro Nro?: s
  5. Agregar otro Nro?: s
  6. Agregar otro Nro?: s
  7. Agregar otro Nro?: n
  8. Mostrar Lista:
  9. 55 11 69 26 5 44 27 Valor a buscar:
  10. 69
  11. El numero: 69 esta en la posicion 3 de la lista
  12. Desea hacer otra busqueda S/N: n
  13. Eliminar numero en la posicion:
  14. 3
  15. Eliminado: 69
  16. 55 11 26 5 44 27 Desea Eliminar otro objeto:

a lo que me refiero es que los que esten en 0 osea al valor que vas a aliminar colocalo en 0 y  tomalos como si estubieran eliminados y muestras la lista


Título: Re: Eliminar nodo de lista?
Publicado por: egyware en 10 Febrero 2010, 16:32 pm
ni yo puedo aplicar lo que dijo egyware suena facil decirlo pero hacerlo en el code puff :¬¬ yo estuve viendo

Y eso que te di la solución, COPY/PASTE osbiamente sin tu menú
vaya que has salido porfiado mi idea no era solucionarte el codigo es que APRENDAS como es toda esta cosa a nosotros el profresor nos hizo dibujar todo eso  antes de aplicar el codigo y aprendi creo que el 90% de la clase aprendio bien  aplicar los nodos.

Citar
a lo que me refiero es que los que esten en 0 osea al valor que vas a aliminar colocalo en 0 y  tomalos como si estubieran eliminados y muestras la lista
Pero siguen en la lista ocupando memoria, eso no es eliminar eso es ocultar -.-

Código
  1. //Veamos
  2. public /*lista*/void eliminar (int n){ /*Modifico el tipo porque modifica la estructura interna y no devuelve una nueva lista*/
  3. int pos=1;
  4. numero t=i;
  5. if (t!=null){//Esto esta bien comprobar siempre la lista no esta vacia
  6.              if(n==0){//Caso particular, es el primero
  7.                     //Como almacenamos previamente el primero de la lista, lo desligamos de la lista
  8.                     i = i.retsig();  // i = i.siguiente
  9.                     t.setsig(null); // t.siguiente = null
  10.                     //Ahora desicion tuya que haces con t, nodo eliminado
  11.                     System.out.println("Nodo[0]="+t.retx()+",eliminado");
  12.              }else{
  13.                     //Buscar el anterior
  14.                     for(;pos<=n-1;pos++){
  15.                        if(t==null)//llegamos al final
  16.                             return;//salimos sin exito T_T
  17.                        t = t.retsig();  
  18.                     }
  19.                     /*encontramos el anterior y ahora que hacemos  es guardar el nodo a borrar que es justamente el siguiente*/
  20.                     numero borrar = t.retsig();                
  21.                     //lo desenlazamos
  22.                     t.setsig(t.retsig().retsig());//t.siguiente = t.siguiente.siguiente
  23.                     /*Terminamos de desenlazar para que el nodo extraido no apunte a ninguna parte de la lista*/
  24.                     borrar.setsig(null);//t.siguiente = null
  25.                     System.out.println("Nodo["+n+"]="+borrar.retx()+",eliminado");
  26.              }
  27. }
  28.  
Bueno eso seria para borrar espero no haberme equivocado ya que no lo he probado, fijate que explique el codigo y use el mismo algoritmo que propuse antes. Te recomiendo ALTAMENTE que hagas una representacion grafica (como el dibujo que te mostre antes) y elijas un nodo cualquiera, y que escribas los pasos con cualquier algoritmo de como borrarlo.
Haslo!!!


Saludos