Eliminar nodo de lista?

Iniciado por monsefoster, 29 Enero 2010, 08:43 AM

0 Miembros y 5 Visitantes están viendo este tema.

monsefoster

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 (java) [Seleccionar]
import paquete.*;
import java.io.*;
public class principal {

public static void main(String[] args) throws IOException{
BufferedReader en = new BufferedReader (new InputStreamReader (System.in));
String r;
numero n;
int valor;
lista L = new lista ();
do{
valor=(int)(99*Math.random()+1);
n=new numero (valor);
L.agregar(n);
System.out.print ("Agregar otro Nro?: ");
r=en.readLine();
r=r.toUpperCase();
}while (r.equals ("S"));
System.out.println ("Mostrar Lista: ");
L.mostrar();
do{
System.out.println ("Valor a buscar: ");
valor = Integer.parseInt(en.readLine());
L.buscar(valor);
System.out.print ("Desea hacer otra busqueda S/N: ");
r=en.readLine ();
r=r.toUpperCase();
}while (r.equals("S"));
do{
System.out.println ("Eliminar numero en la posicion: ");
valor = Integer.parseInt(en.readLine());
L.eliminar();
L.mostrar();
System.out.println ("Desea Eliminar otro objeto: ");
r=en.readLine();
r=r.toUpperCase();
}while (r.equals ("S"));
}
}


Código (java) [Seleccionar]
package paquete;


public class numero {
private int num;
private numero sig;

public numero(int x) {
num=x;
sig=null;
}
public int retx(){
return num;
}
public numero retsig(){
return sig;
}
public void setsig(numero n){
sig=n;
}
}


Código (java) [Seleccionar]
package paquete;

public class lista {
private numero i;

public lista() {
i=null;
}
public void agregar (numero n){
if (i==null){
i=n;
}
else{
n.setsig(i);
i=n;
}
}
public void mostrar(){
numero t=i;
if (i!=null){
while (t!=null){
System.out.print(t.retx()+" ");
t=t.retsig();
}
}
else{
System.out.println ("Lista Vacia");
}

}
public void buscar (int x){
numero t=i;
int pos=1;
if (i!=null){
while (t!=null){
if (t.retx()==x){
System.out.println ("El numero: "+x+" esta en la posicion "+pos+ " de la lista");
break;
}
t=t.retsig();
pos++;
}
if (t==null)
System.out.println ("El numero "+x+" no esta en la lista");
}
}
public lista eliminar (int n){
int pos=1;
numero t=i;
if (t!=null){
if (pos==n){
while (pos=n){
}
t=t.setsig();
}
else{
pos++;
}
}

}
}


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:

egyware

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




monsefoster

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:






Debci

Cita de: 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:






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

egyware

 :rolleyes:
Para acceder a la lista es facil
Código (java) [Seleccionar]

public class Nodo{
  int value;
  Nodo next;
}
//Por ahi
Nodo aux = lista;
while(aux != null){
    Sytem.out.println(aux.next);
    aux = aux.next;
//Para que paresca como arreglo
aux = lista
for(int i;aux!=null;i++){
    Sytem.out.println("lista["+i+"]="+aux.next);
    aux = aux.next;
}
}


Saludos

PS:
Cita de: ..::| D3Bć1 |::. en 30 Enero 2010, 23:21 PM
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.

Debci

Cita de: egyware en 30 Enero 2010, 23:26 PM
:rolleyes:
Para acceder a la lista es facil
Código (java) [Seleccionar]

public class Nodo{
  int value;
  Nodo next;
}
//Por ahi
Nodo aux = lista;
while(aux != null){
    Sytem.out.println(aux.next);
    aux = aux.next;
//Para que paresca como arreglo
aux = lista
for(int i;aux!=null;i++){
    Sytem.out.println("lista["+i+"]="+aux.next);
    aux = aux.next;
}
}


Saludos

PS:
Cita de: ..::| D3Bć1 |::. en 30 Enero 2010, 23:21 PM
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

egyware

Me referias pasarlo a XML eso seria matar una mosca con un cañon.

monsefoster

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!

egyware

#8
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 (java) [Seleccionar]
public class Nodo{
public  int value;
public Nodo next;
}
//En el main
int buscar = 10;//por colocarle :P
Nodo lista = ...
Nodo aux = lista;
//revisar el primer nodo
if(aux.value== buscar){
 aux = aux.next; //Corro el puntero hacia el siguiente desenlazando
 lista = aux;
}else
while(aux!=null){
  if(aux.next!=NULL){
    if(aux.next.value == buscar){
         //¡¡¡Encontrado!!!! vea anexo XD
    }
  }
}


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)

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 (java) [Seleccionar]
//Anexo XD
//Aqui se ve como la fig 2)
Nodo borrar = aux.next; //Guardamos el nodo
aux.next = aux.next.next; //anterior.siguiente = anterior.siguiente.siguiente  fig 3) ;)
//todavia el valor a sacar queda apuntando a parte de la lista
borrar.next = null; //Con esto queda como fig 3.b)


Bueno eso seria saludos

Leyer

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> {}