Lista encadeada [Resolvido]

12 respostas
masterpablo

Olá amigos,
esu estou com uma duvida que me tirou o sono esta noite e gostaria de saber se voces podem me ajudar a resolver mais este problema.

Bom, eu tenho um metodo que le os numeros de um arquivo e vai guardando este numeros em uma lista encadeada em ordem descrescente. Esse método se chama insere. O método insere solicita que seja passado um nó da lista para que ele funcione.

Esse método insere está funcionando normalmente. Em um determinado momento da vida, eu quero que essa lista seja clonada, e para isso criei um método que se chama clone e esse metodo exige que seja passado uma lista para que ele possa cloná-la. Pois bem, a primeira posiçao ele clona perfeitamente e insere (atraves do metodo insere) na lista clonada, mas feito isso, ele meio que esvazia a primeira lista e eu nao consigo mais. Isso só acontece quando eu mando inserir. Se eu mandar percorrer a lista que foi passada na chamada de método ele percorre normalmente, mas quando eu chamo o método insere… já era… e ele entra em looping tb.

Por favor deem uma olhada nos dois métodos:

public Lista clone(Lista teste){
		Lista aux = new Lista();
		NodeBI m = teste.sentinela.next;
				
		while (m!=sentinela){
			m=m.next;
			aux.insere(m);
						
		}
		
		return aux;
	}
// insere os valores ordenados em uma lista
	private void insere(NodeBI novo){
		if (isEmpty()){ // se a lista estiver vazia, coloque depois do sentinela
			sentinela.next=novo;
			sentinela.prev=novo;
			novo.prev=sentinela;
			novo.next=sentinela;
			contNodos=contNodos.add(um);//incrementa contNodos
		}
		
		else { 
			NodeBI p = sentinela; // cria node p e iguala ao sentinela
			
			while (p.next!=sentinela && novo.valor.compareTo(p.next.valor)<0) // enquanto o p.next for diferente de sentinela e valor de novo for menor do que valor de p
				p=p.next; 
			
			p.next.prev=novo;
			novo.next=p.next;
			p.next=novo;
			novo.prev=p;
			contNodos=contNodos.add(um);//incrementa contNodos
		
		} // fim do while
	}// fim do metodo insere

Por favor, me ajudem!

12 Respostas

berg.pb

pq q vc unicamente não cria outro objeto q faz a mesma referência pra o objeto original, sem precisar varrer a lista?

masterpablo

Por que eu preciso ter duas listas iguais,

depois eu vou ter que ir retirando elementos da lista clonada e isso nao pode alterar a lista original.

entendeu?

Tassni_Eunice

Pablo, vc quer no final fazer alguma verificação de divisibilidade?

masterpablo

'Não, eu vou receber um conjunto de numeros e no final eu vou querer saber se na lista existe todos esses numeros que ele passou.

E eu vou fazer isso retirando os numeros da lista clone. Nao posso retirar da lista original porque se este numero nao servir, eu vou gerar outro e assim por diante, ate achar um que possa ser formado.

Ok?

Tassni_Eunice

1. public Lista clone(Lista teste){ 2. Lista aux = new Lista(); 3. NodeBI m = teste.sentinela.next; 4. 5. while (m!=sentinela){ 6. m=m.next; 7. aux.insere(m); 8. 9. } 10. 11. return aux; 12. }

Bom… eu não entendi o seguinte… sua lista é circular??? Pq se não for… o NodeBi ‘m’ nunca será igual a sentinela e talvez por isso fique em loop.
E segundo… se sua sentinela possui internamente todos os outros Nodes, basta vc igualar aux.sentinela = Lista.sentinela que ele puxará todos os nós.

masterpablo

Na verdade a lista é circular sim,
mas se eu fizer isso que vc esta falando, quando eu deletar algum no da lista clone, ele vai tirar da principal tb. Ou nao?

Tassni_Eunice

Bom… vamos lá…

1. public Lista clone(Lista teste){ 2. Lista aux = new Lista(); 3. NodeBI m = teste.sentinela.next; 4. 5. while (m!=sentinela){ 6. m=m.next; 7. aux.insere(m); 8. 9. } 10. 11. return aux; 12. }

Na linha 6 creio eu que vc deveria tentar inserir primeiramente o no m antes de incrementa-lo ja que vc já começa com m no teste.sentinela.next, então vc esta dando dois passos tenta inverter a linha 6 e 7 de lugar e me fala o que ta dando

masterpablo

Ok, isso estava errado mesmo mas ainda nao é o suficiente.

Eu testei aqui o que vc me disse. eu igualei o sentinela da lista aux ao sentinela da lista que eu recebi no metodo e funcionou. Mas quando eu deleto um no da lista aux ele deleta da outra tb, pq na verdade a lista aux so visualiza a outra lista e isso nao pode acontecer.

O que eu quero é deletar de uma e nao deletar da outra e por isso que eu tinha que copiar de uma pra outra.

Tassni_Eunice

Sim… eu pensei nisso depois que mandei aquela msgm… Realmente se vc igualar do jeito que tinha colocado ele vai apontar como um ponteiro.

Bom… qual o erro que persiste agora que vc corrigiu a linha 6 e 7 que eu tinha falado, pra eu poder pensar…?

masterpablo

vamos imaginar que a lista original tenha os valores 4 2 1

Quando eu falo que NodeBI m=sentinela.next, ele fica valendo 4. Muuiiiito bom.

Se eu falar que m=m.next ele passa a ser 2 e se eu falar que nodeBI m=m.next.next ele passa a ser 1 e até aí tá bom demais.

O problema é que antes de eu incrementar o m, eu tenho que passa-lo para o metodo insere para que este realize a inserçao, e ele realmente insere o 4 na lista 2.

Porem, tem alguma coisa no meu metodo insere, pois quando o comando retorna ao while do metodo clone e o m é incrementando m=m.next, ao inves de ele valer 2 ele fica valendo 0, ou seja, meu metodo insere ta fazendo alguma coisa com a minha lista original que os elementos que vem depois do primeiro estao sendo perdidos e a minha lista original fica como se tivesse o elemento 4.

Entendeu?

tem msn?

Tassni_Eunice

Pode ta ocorrendo algum problema de referencia por vc estar usando o proprio No da lista teste.

Ao invés disso... crie um outro No dentro da sua função Clone e faça tipo o seguinte:
public Lista clone(Lista teste){    
      Lista aux = new Lista();    
        NodeBI m = teste.sentinela.next;    
 NodeBi novo = new NodeBi();      
              
        while (m!=sentinela){

    
           m=m.next;    
novo.valor = m.valor;

           aux.insere(novo);    
                           
        }    
      
       return aux;      
 }

Tenta isso e da retorno aí... talvez eu de uma saída agora e mais tarde eu olhe de novo

masterpablo

Tassni, muito obrigado.

Resolvi meu problema aqui alterano alguns parametros na chamada do metodo!

Um abraço!

Criado 26 de setembro de 2008
Ultima resposta 26 de set. de 2008
Respostas 12
Participantes 3