Duvida com lista simples

11 respostas
Y

eu preciso criar um programa para cadastrar o rg de um numero indeterminado de pessoas e no final
realizar um sorteio e imprimir o rg sorteado, mas na hora de imprimir eu não estou conseguindo, só sai o endereço da memória

public class ListaSimples {
	public Nodo prim;

    public ListaSimples() {
    	this.prim = null;
    }
    
    public void mostraLista(){
    	Nodo nodoaux = prim;
    	while(nodoaux!=null){
    		nodoaux.mostraNodo();
    		nodoaux = nodoaux.next;
    	}
    }
    
    public void insereInicio(int elemento){
    	Nodo novoNodo = new Nodo(elemento);
    	novoNodo.next = prim;
    	prim = novoNodo;
    }
    
    public boolean isEmpty(){
    	if(prim==null)
    		return true;
    	else
    		return false;
    }
    
    public Nodo removeInicio(){
    	Nodo nodoaux = prim;
    	prim = prim.next;
    	return nodoaux;
    }
    
    public void insereFim(int elemento){
    	if(!isEmpty()){
    		Nodo nodoaux = prim;
    		while(nodoaux.next!=null){
    			nodoaux = nodoaux.next;
    		}
    		Nodo novoNodo = new Nodo(elemento);
    		nodoaux.next = novoNodo;
    	}
    	else
    		insereInicio(elemento);
    }
    
    public Nodo removeFim(){
    	Nodo nodoUltimo = prim;
    	Nodo nodoAnterior = prim;
    	while(nodoUltimo.next != null){
    		nodoAnterior = nodoUltimo;
    		nodoUltimo = nodoUltimo.next;
    	}
    	if(nodoAnterior != nodoUltimo)
    		nodoAnterior.next = null;
    	else
    		prim = null;
    	return nodoUltimo;
    }
    
	public void insere(int elemento, int posicao){
		if((posicao == 1)||(prim == null))
			insereInicio (elemento);
		else{
			int contaNodos = 1;
			Nodo nodoaux = prim;
			while(nodoaux.next != null){
				nodoaux = nodoaux.next;
				contaNodos++;
			}
			if(posicao>contaNodos)
				insereFim(elemento);
			else{
				contaNodos = 1;
				nodoaux = prim;
				while(contaNodos < posicao){
					nodoaux = nodoaux.next;
					contaNodos++;
				}
				
				Nodo novoNodo = new Nodo(elemento);
				novoNodo.next = nodoaux.next;
				nodoaux.next = novoNodo;
			}
		}
	}
}
import javax.swing.*;
public class TerceiroT1 {
    public static void main(String[] args) {
        int cont=0, id=0, i=0, j;
        int a[]=new int[999999];
        
        ListaSimples l = new ListaSimples();
        
        while(id != 9999){
        	cont++;
        	id=Integer.parseInt(JOptionPane.showInputDialog("informe o numero da identidade: "));
        	l.insereInicio(id);
        	i++;
        	a[i]=id;
    	}
        j=(int)(Math.random()*cont+1);
        for(i=1; i<cont; i++){
        	System.out.println(l.removeInicio());
        }
        
    }
}

11 Respostas

T

A sua classe Nodo deve definir um método “public String toString()”

Y
essa
public class Nodo {

    public int dado;
    public Nodo next;
  
    public Nodo(int elemento){
    	this.dado = elemento;
    	this.next = null;
    }
    
    public void mostraNodo(){
    	System.out.print("\n Dado: "+this.dado + "endereco: " +this.next );
    }
}

como assim

T
System.out.println(l.removeInicio());

É a mesma coisa que:

Nodo n = l.removeInicio();
System.out.println (n.toString());

Então você tem de implementar o toString. Não?

Y

deixa eu tentar fazer uma coisa

Y
import javax.swing.*;
public class TerceiroT1 {
    public static void main(String[] args) {
        int cont=0, id=0, i=0, j;
        
        ListaSimples l = new ListaSimples();
        
        while(id != 9999){
        	cont++;
        	id=Integer.parseInt(JOptionPane.showInputDialog("informe o numero da identidade: "));
        	l.insereInicio(id);
        	i++;
        	a[i]=id;
    	}
    	
        j=(int)(Math.random()*cont+1);
        System.out.println(j);
        
        for(i=1; i<j; i++){
        	l.removeFim();
        }
        Nodo aux = l.removeFim();
    	aux.mostraNodo();
    		
        System.out.println("\n");
    }
}

minha lista simples ficou assim agora
mas como eu faço para não poder repetir o rg ?

T

Você pode criar um método “insere” que seja semelhante a “insereFim”, mas só faz isso se, olhando a lista inteira, não achar alguém com o mesmo RG.

Y

na minha lista tem um insere na linha 62.
é isto que voce esta falando

T

É isso mesmo. Se você não quer que se repitam, evite que se repitam já na inserção, logo de cara.

Y

como assim eu não entendi ?
desculpa minha burrice mas eu estou aprendendo ainda.

T

É assim. Você tem uma lista de Nodos.
Um campo desse nodo deve ter o RG (sinto muito, mas não li seu programa inteiro).
Usando uma lógica parecida com aquele método que imprime a lista de nodos, faça um método que acha um nodo com um determinado RG.
Se você achar esse tal nodo, então você NÃO INSERE o nodo, já que você vai acabar tendo um RG repetido se você conseguir inserir.
Senão, você insere.

gpd38

Fiz correndo e ainda nao testei.

De uma olhada e melhore.
Existe comparações que nao precisam ser feitas ei fiz a mais

public void insereInicio(int elemento) {

		Nodo novoNodo = new Nodo(elemento);
		Nodo inicial = prim;
		while (inicial != null && inicial != novoNodo && inicial.next != null)
			inicial = inicial.next;

		if (inicial != novoNodo || inicial.next != novoNodo) {
			novoNodo.next = prim;
			prim = novoNodo;
		}
	}
Criado 19 de setembro de 2008
Ultima resposta 20 de set. de 2008
Respostas 11
Participantes 3