Foros del Web » Programación para mayores de 30 ;) » Java »

Ayuda con listas enlazadas!

Estas en el tema de Ayuda con listas enlazadas! en el foro de Java en Foros del Web. Saludos!Por favor les pido ayuda! Necesito crear una clase tipo lista enlazadas simple. Tengo problemas con dos métodos importantes en el programa y e intentado ...
  #1 (permalink)  
Antiguo 23/09/2008, 16:30
 
Fecha de Ingreso: abril-2008
Mensajes: 31
Antigüedad: 16 años
Puntos: 1
Exclamación Ayuda con listas enlazadas!

Saludos!Por favor les pido ayuda! Necesito crear una clase tipo lista enlazadas simple. Tengo problemas con dos métodos importantes en el programa y e intentado muchas cosas pero no me sale. Si alguien me puede ayudar se lo agradeceré porque es que no estoy muy diestro en java soy nuevo en esto. Con la clase SLLNode no tengo problemas sino con la clase singlelist con los métodos searchnode y sortedInsert.


public class SLLNode {
private int info;
private SLLNode next;

public SLLNode(int i, SLLNode n){
this.info=i;
this.next=n;
}

public void setnext(SLLNode n){
this.next=n;
}

public void setinfo(int i){
this.info=i;
}

public SLLNode getnext(){
return this.next;
}

public int getinfo(){
return this.info;
}


}



public class singlelist {
private SLLNode head;
private SLLNode tail;
private int size;
private boolean printlist;
public SLLNode prt, temp;
public boolean res;


public singlelist (){
head=null;
tail=null;
size=0;
}

public void addTohead(int i){
if(size==0){
head=new SLLNode(i,null);
tail=head;
size++;
}else{
head=new SLLNode(i,head);
size++;
}
}

public void addTotail(int i){
if(size==0){
tail=new SLLNode(i,null);
head=tail;
size++;
}else{
tail.setnext(new SLLNode(i,null));
tail=tail.getnext();
size++;
}
}

void deleteFromhead(){
if(size!=0){
SLLNode prt;
prt=head;
if(head!=tail){
head=head.getnext();
size--;
prt=null;
}else{
head=tail=null;
size--;
}
}
}

void deleteFromtail(){
SLLNode prt;
prt=head;
if(head!=tail){
while(prt.getnext()!=tail){
prt=prt.getnext();
}
tail=prt;
prt=prt.getnext();
tail.setnext(null);
size--;
prt=null;
}
}
public boolean isEmpty(){
if(size==0){
return true;
}else{
return false;
}
}

void printlist(){
SLLNode prt;
prt=head;
for(int i=0;i<size;i++){
System.out.println(prt.getinfo()+" ");
prt=prt.getnext();
}
}

public void makeEmpty(){
while(printlist!=isEmpty()){
deleteFromtail();
}
}
//Arreglar este metodo
public SLLNode searchnode(int i){
SLLNode prt;
prt=head;
while(prt.getnext()!=i){//Tengo problemas para recorer la lista
if(prt.getinfo()==i){
System.out.println("Nodo encontrado"+i);
}else{
System.out.println("No se encontró el nodo");
}
}
}

public boolean deleteNode(int i){
searchnode();
if(prt.getinfo()==i){

return res=true;
}else{
return res= false;
}
}

public boolean isInlist(int i){
searchnode();
if(prt.getinfo()==i){
return res=true;
}else{
return res=false;
}
}
//Arreglar el ordenamiento burbuja para listas enlazadas
public void sortedInsert(int i){
SLLNode prt;
SLLNode temp;
int j=0;//No se como ordenar listas y lo hice como si fuera un vector
for(i=0;i<size;i++){
for(j=size-1;j>=i;j++){
if(i>prt.getinfo()){
temp=prt(i);
j=j-1;
prt(j-1)=temp;

}
}
}
}

public static void main(String[] args){
singlelist list=new singlelist();

list.addTotail(3);
list.addTotail(7);
list.addTotail(9);
list.addTotail(2);
list.addTotail(1);
list.addTotail(5);
list.addTotail(8);
list.addTotail(4);
list.addTotail(9);

list.printlist();
list.sortedInsert();
list.deleteFromtail();
list.searchnode();
list.isInlist();
list.deleteNode();
list.makeEmpty();
list.isEmpty();
}
}
  #2 (permalink)  
Antiguo 23/09/2008, 19:26
 
Fecha de Ingreso: septiembre-2008
Ubicación: Córdoba
Mensajes: 67
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda con listas enlazadas!

Tenes que iterar sobre la lista para encontrar el nodo que contiene la info que buscas. Para ello tenes 2 posibilidades: 1) la lista esta vacia por lo que deberia devolver null (en este caso creo) o podrias lanzar una excepcion.
2) la lista ya tiene elementos por lo que debes iterar

Para ello debes tener en cuenta que representa cada atributo de tu clase SLLNode

public class SLLNode {
private int info; --> contiene la info del nodo
private SLLNode next; --> apunta al proximo nodo


public SLLNode searchnode(int i){
SLLNode prt;
prt=head;
if(prt==null)
return null; // Tb podrias haber lanzado una excepcion
//while(prt.getnext()!=i){//Tengo problemas para recorer la lista
// con while seria
while(prt.getNext()!=null) {
// itera mientras haya un prox nodo, o sea la referencia al proximo nodo sea distinta de null,
if(prt.getinfo()==i) {
// System.out.println("Nodo encontrado"+i); --> supongo que es para prueba unicamente
// recuerda que debes devolver un objeto tipo SSLNode
return prt;
} // fin if
else{
// System.out.println("No se encontró el nodo"); --> debes recorrer toda la lista (Iterar)
prt = prt.getNext();
// ahora prt hace referencia al proximo nodo
} // fin else
} // fin while
// Ahora ya recorriste toda la lista; por lo que no encontro el dato que buscabas,
// pues si lo hubiera encontrado al hacer return del nodo el metodo hubiera finalizado
// System.out.println("No se encontró el nodo"); --> En caso de querer informar lo deberia
// hacer quien invoca el metodo
return null; // Tb podrias haber lanzado una excepcion
}

Espero te haya servido algo la explicacion, el metodo no lo probe, creo que funciona, tal vez lo puedas mejorar y hacer el otro tb.
Suerte...
  #3 (permalink)  
Antiguo 23/09/2008, 19:41
 
Fecha de Ingreso: abril-2008
Mensajes: 31
Antigüedad: 16 años
Puntos: 1
Respuesta: Ayuda con listas enlazadas!

Le agradezco inmensamente su ayuda PachuG. Asi lo intentare GRACIAS!
  #4 (permalink)  
Antiguo 23/09/2008, 20:02
 
Fecha de Ingreso: abril-2008
Mensajes: 31
Antigüedad: 16 años
Puntos: 1
Respuesta: Ayuda con listas enlazadas!

No se si podría ayudarme con el método public void sortedInsert(int i) para ordenar una lista de menor a mayor. Es que yo se que no puedo hacerlo como con arrays pero no de que otra forma porque todavía no me han enseñado el ordenamiento burbuja con listas sencillas pero nos dieron de tarea hacerlo y he buscado información pero no entiendo. Me podria ayudar con ese metodo? De todas maneras muchas gracias sinceramente!
  #5 (permalink)  
Antiguo 24/09/2008, 08:23
 
Fecha de Ingreso: septiembre-2008
Ubicación: Córdoba
Mensajes: 67
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda con listas enlazadas!

Juarod, creo que el metodo public void sortedInsert(int i) es para insertar ordenadamente. Por ej. Tenés la lista con los nodos cuyos info son:

1 --> 3 --> 5 --> 6 --> null

Y te llega el nodo con info 2, pues deberias insertar el nodo para que la lista quede de esta forma.

1 --> 2 --> 3 --> 5 --> 6 --> null

Así pues, tenés 2 posibilibidades de como insertar esto

1) La lista esta vacia, por lo que el head deberia apuntar al nodo que te llega
2) La lista tiene elementos
2.1) La info del elemento a insertar es menor a la info de todos los elementos de la lista.
En este caso seria un addToHead
2.2) La info del elemento a insertar es mayor a la info de todos los elementos de la lista.
En este caso seria un addToTail
2.3) La info del elemento a insertar es menor a algunos elementos de la lista y mayor a algunos elementos de la lista. O sea insertar en el lugar que corresponda sin ser al frente, ni en la cola.

Ej. 1)

head --> null

Llega el nodo prt con info = 2, entonces quedaría

head --> 2

Ej. 2.1)

head --> 2

Llega el nodo prt con info = 1, entonces quedaría

head --> 1 --> 2

Ej. 2.2)

head --> 1 --> 2

Llega el nodo prt con info = 4, entonces quedaría

head --> 1 --> 2 --> 4

Ej. 2.3)

head --> 1 --> 2 --> 4

Llega el nodo prt con info = 3, entonces quedaría

head --> 1 --> 2 --> 3 --> 4

Código:

public void sortedInsert(int i){

SLLNode prt;

//int j=0;//No se como ordenar listas y lo hice como si fuera un vector
// for(i=0;i<size;i++){

// Primero debo chequear si la lista esta vacia
if(head== null) {
head=new SSLNode(i,null);
// si esta vacia, el head de mi lista apuntara al nuevo nodo creado con info i.
}

else {

// caso contrario itero la lista
// Con for seria asi
for(prt=head; prt.getNext()!=null; prt=prt.getNext()) {
// el inicio del for sera el head o sea el nodo a donde apunte el head, que seria el
// primer elemento de la lista; itera mientras el proximo nodo sea distinto de null;
// el incremento seria al proximo nodo al referenciado actualmente.

if(i>=prt.getInfo() && i<=prt.getNext().getInfo()) { // Si la info que recibo por
//parametro, es mayor o igual a la del actual nodo y menor o igual a la del
//proximo deberia insertarlo en este lugar. Ej. 2.3) Entonces
SLLNode temp= new SSLNode(i, prt.getNext());
//Creo el nodo temp con info i y con ref al proximo nodo de prt.
prt.setNext(temp);
//prt ahora apunta a temp
}//fin del if

// Si no cumple la condicion del if, es porque el i es menor al valor del info actual
// y por lo tanto tb del prox o porque es mayor que la info actual y tb del prox.

else if(i<=prt.getInfo()) { // si es menor, entonces deberia ir al frente siempre
SLLNode temp= new SSLNode(i, prt);
//Creo el nuevo nodo con info i, y referencia al nodo prt
head=temp;
//Ahora el head de mi lista apunta al nuevo nodo
}//fin del else if

// Si no cumple ningua de las cond anteriores, entonces es mayor a todos.
// El for recorre hasta el ultimo nodo, por lo que saldra solo y el nodo prt hara
// referencia al ultimo nodo

}//fin del for

// Ahora salio del for y se debe a dos posibilidades o ya se inserto el elemento o
// es mayor a todos como se dijo anteriormente, por lo tanto debo chequear lo
//ultimo

if(i>prt.getInfo()) { // Es mayor al ultimo, por lo tanto a todos los restantes
SLLNode temp= new SSLNode(i, null);
prt.setNext(temp);
//Creo el nuevo nodo con info i, y con ref al prox igual a null.
//El nodo prt, o sea el que estaba al ultimo referencia a ahora a al nuevo nodo
} // fin del if
} // fin del metodo

Espero te sirva, el codigo como siempre no esta chequeado, puede tener errores, lo importante es la logica, la cual puede variar tb, lo puedes hacer con dos for como venias haciendo o modificar algo de lo que hice.
Saludos...
  #6 (permalink)  
Antiguo 24/09/2008, 09:53
 
Fecha de Ingreso: abril-2008
Mensajes: 31
Antigüedad: 16 años
Puntos: 1
Respuesta: Ayuda con listas enlazadas!

MUCHISIMAS GRACIAS PachuG eres un genio! jeje! ya pude resolver. Gracias infinitamente positivo!
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 16:19.