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:
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"));
}
}
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;
}
}
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:
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
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:
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
:rolleyes:
Para acceder a la lista es facil
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.
Cita de: egyware en 30 Enero 2010, 23:26 PM
:rolleyes:
Para acceder a la lista es facil
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
Me referias pasarlo a XML eso seria matar una mosca con un cañon.
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!
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
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)
(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
//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
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> {}
L-Eyer no seas impaciente ademas no quiero darle la tarea hecha si se la doy hecha le ira mal en el certamen >:(
;D
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
Y continuo con lo del nodo...
lo estoy haciendo mal probablemente...
public void eliminar (numero x){
numero t=i;
numero ant=x.sig;
ant.sig=t.sig;
if (i!=null){
while (t!=null){
if (t.retx()==x.num){
ant.sig=t.sig;
}
t=t.retsig();
ant.sig=t.sig;
}
}
}
Ayuda! :huh:
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!
No entendi muy bien lo que quisiste decir...
:huh:
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
Agregar otro Nro?: s
Agregar otro Nro?: s
Agregar otro Nro?: s
Agregar otro Nro?: s
Agregar otro Nro?: s
Agregar otro Nro?: s
Agregar otro Nro?: n
Mostrar Lista:
55 11 69 26 5 44 27 Valor a buscar:
69
El numero: 69 esta en la posicion 3 de la lista
Desea hacer otra busqueda S/N: n
Eliminar numero en la posicion:
3
Eliminado: 69
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
Cita de: 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
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.
Citara 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 -.-
//Veamos
public /*lista*/void eliminar (int n){ /*Modifico el tipo porque modifica la estructura interna y no devuelve una nueva lista*/
int pos=1;
numero t=i;
if (t!=null){//Esto esta bien comprobar siempre la lista no esta vacia
if(n==0){//Caso particular, es el primero
//Como almacenamos previamente el primero de la lista, lo desligamos de la lista
i = i.retsig(); // i = i.siguiente
t.setsig(null); // t.siguiente = null
//Ahora desicion tuya que haces con t, nodo eliminado
System.out.println("Nodo[0]="+t.retx()+",eliminado");
}else{
//Buscar el anterior
for(;pos<=n-1;pos++){
if(t==null)//llegamos al final
return;//salimos sin exito T_T
t = t.retsig();
}
/*encontramos el anterior y ahora que hacemos es guardar el nodo a borrar que es justamente el siguiente*/
numero borrar = t.retsig();
//lo desenlazamos
t.setsig(t.retsig().retsig());//t.siguiente = t.siguiente.siguiente
/*Terminamos de desenlazar para que el nodo extraido no apunte a ninguna parte de la lista*/
borrar.setsig(null);//t.siguiente = null
System.out.println("Nodo["+n+"]="+borrar.retx()+",eliminado");
}
}
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