Implementacao LISTA em JAVA
Implementacao LISTA em JAVA
Objetivos
Ao final dessa aula, você deve saber como implementar a estrutura de da-
dos Lista em Java e entender sua aplicação em problemas computacionais.
Pré-requisitos
Introdução
Você lembra o que é uma Lista? A Lista é uma estrutura mais abrangente que
a Pilha e a Fila, pois permite operações de entrada e saída em qualquer lugar,
como pode ser observado na Figura 1. Conforme fizemos nas aulas anteriores,
vamos seguir o modelo apresentado, que é o mesmo da disciplina anterior, e
implementar essa idéia em Java com programação orientada a objetos.
!
"
#
Saiba mais
É importante aprofundar os estudos utilizando livros (DEITEL; DEITEL,
2005) (GOODRICH; TAMASSIA, 2007) (LAFORE, 2004) (PUGA;
RISSETTI, 2003), onde você poderá conhecer outros pontos de vista
sobre o assunto e, conseqüentemente, outras formas de implementar a
estrutura de dados Lista.
Como você já deve ter percebido, a nossa LISTA é composta por elemen-
tos (ou itens) da mesma forma que a pilha e a fila das aulas anteriores. A
diferença entre a Classe LISTA e as Classes FILA e PILHA são relativas às ope-
rações de entrada e saída. Quanto aos atributos desta classe, são iguais aos
da PILHA, mas diferem da FILA por não ter o controle de fim. O controle de fim
da LISTA não é utilizado aqui, para simplificar os controles, uma vez que esse
controle só auxiliaria efetivamente para as inserções no fim da LISTA.
//procurando posicao
while((i < pos-1)&&(item.retornaProx() != null)){
item = item.retornaProx();
i++;
}
//adiciona na lista
ItemLista novoItem = new ItemLista();
novoItem.atribuiDado(dado);
novoItem.atribuiProx(item.retornaProx());
item.atribuiProx(novoItem);
this.numeroElementos ++;
}
}
//procurando posicao
while((i < pos-1)&&(item.retornaProx() != null)){
item = item.retornaProx();
i++;
}
ItemLista ItemRemovido = item.retornaProx();
item.atribuiProx(item.retornaProx().retornaProx());
this.numeroElementos --;
ItemRemovido = null;
}
}
//procurando posicao
while((i != pos)&&(item.retornaProx() != null)){
item = item.retornaProx();
i++;
}
return item.retornaDado();
}
Para inserir no fim, basta chamar insere na posição, passando como pa-
râmetro a quantidade de elementos da LISTA mais um. Se a LISTA possuir 5
elementos e quisermos inserir mais um no fim da LISTA, ele será o elemento 6,
ou seja, quantidade de elementos mais um.
Vamos verificar agora como utilizar essa classe. Para fazermos isso, utili-
zaremos um programa simples, que permite manipular os elementos da LISTA,
utilizando os métodos que implementamos para a Classe LISTA.
import java.util.Scanner;
import jtads.TADS.Lista;
public Main() {
}
public static void main(String[] args) {
Lista minhaLista = new Lista();
int opcao = 0;
Scanner scn = new Scanner(System.in);
String msg,msg2;
do {
System.out.println(“1) Insere Inicio”);
System.out.println(“2) Insere Posição”);
System.out.println(“3) Insere Fim”);
System.out.println(“4) Remove Inicio”);
System.out.println(“5) Remove Posição”);
System.out.println(“6) Remove Fim”);
System.out.println(“7) Mostra Dados”);
System.out.println(“8) Quantidade Elementos”);
System.out.println(“9) Vazia”);
System.out.println(“10) Mostra o Primeiro”);
System.out.println(“11) Mostra da posição”);
System.out.println(“12) Mostra o Ultimo”);
System.out.println(“0) Sair”);
System.out.println(“Digite a opcao:”);
msg = scn.nextLine();
opcao = Integer.parseInt(msg);
switch(opcao){
case 1:
System.out.println(“Digite o dado: “);
msg = scn.nextLine();
minhaLista.insereInicio(Integer.parseInt(msg));
Break;
case 2:
System.out.println(“Digite o dado: “);
msg = scn.nextLine();
System.out.println(“Digite a posição: “);
msg2 = scn.nextLine();
minhaLista.insereMeio ( Integer.parseInt(msg),
Integer.parseInt(msg2));
break;
case 3:
System.out.println(“Digite o dado: “);
msg = scn.nextLine();
minhaLista.insereFim(Integer.parseInt(msg));
break;
case 4:
minhaLista.removeInicio();
break;
case 5:
System.out.println(“Digite a posição: “);
msg2 = scn.nextLine();
minhaLista.removeMeio(Integer.parseInt(msg));
break;
case 6:
minhaLista.removeFim();
break;
case 7:
minhaLista.Mostra();
break;
case 8:
System.out.println( “Quantidade de elementos = “
+minhaLista.quantElementos());
break;
case 9:
if (minhaLista.vazia())
System.out.println(“Fila Vazia!”);
else
System.out.println(“Fila nao Vazia!”);
break;
case 10:
System.out.println( “Primeiro elemento = “
+minhaLista.dadoInicio());
break;
case 11:
System.out.println(“Digite a posição: “);
msg2 = scn.nextLine();
System.out.println (“O elemento “+msg2+” = “
+minhaLista.adoMeio(Integer.parseInt(msg2)));
break;
case 12:
System.out.println( “Ultimo elemento = “
+minhaLista.dadoFim());
break;
}
} while(opcao != 0);
}
}
Agora que a nossa classe LISTA está testada e funcionando, vamos fazer
uma aplicação que utiliza a Classe LISTA. Leia atentamente o enunciado do
problema que precisaremos resolver.
Exemplo:
Figura 2 – Solução para o problema dos soldados.
Nossa LISTA pode ser percorrida do início ao fim sem problemas, mas a
transição para retornar ao primeiro não é tão natural assim, por isso vamos
utilizar uma variação desta LISTA, a LISTA CIRCULAR.
Para fazermos essa lista circular, vamos apenas fazer com que a refe-
rência ao próximo elemento, do elemento do fim da LISTA (ultimo elemento),
em vez de ficar com NULL para identificar o fim (descontinuidade), receba a
referência do primeiro elemento da LISTA, tornando-a circular.
Isso pode ser feito utilizando herança na classe LISTA, especializando uma
Classe LISTA CIRCULAR, conforme modelo apresentado na Figura 3. Esta clas-
se herdará de LISTA as suas características e reescreverá os métodos INSERE
INICIO e REMOVE INICIO, porque em ambos os casos devemos atribuir a
referência ao atributo próximo do último elemento, de modo que ele sempre
faça referência ao primeiro elemento. Nos outros métodos de inserção e remo-
ção, isso não é necessário, pois tudo já esta adequado.
!
!
"
!
#
!
$
this.numeroElementos --;
ItemRemovido = null;
}
}
//desloca referencia do primeiro da lista para o proximo elemento da lista
public void desloca(){
this.primeiro = this.primeiro.retornaProx();
}
}
Essa solução simplificada não interage com o usuário para simplificar os testes.
Os soldados são inseridos diretamente no código, sendo que o soldado de onde
inicia a contagem e o valor para contagem são gerados de forma aleatória.
// Prepara a lista.
soldados.insereInicio(“A”);
soldados.insereFim(“B”);
soldados.insereFim(“C”);
soldados.insereFim(“D”);
soldados.insereFim(“E”);
soldados.insereFim(“F”);
soldados.insereFim(“G”);
soldados.Mostra();
soldadoInicial = 7;
System.out.println(“Soldado inicial: “+soldadoInicial);
Conclusão
Mais uma vez, fizemos a transformação do TAD para Classe, mas nesta aula
com a estrutura de dados LISTA. Da mesma forma que foi feito com as estruturas de
dados anteriores (Pilha e Fila), transformamos a definição do tipo LISTA em atributos
da Classe e as operações (procedimentos e funções) em métodos dessa classe.
Síntese da aula
Nesta aula, estudamos a estrutura de dados LISTA, que tem como caracte-
rística principal o fato de suas operações de inserção e remoção de dados po-
derem ser feitas em qualquer lugar da LISTA. Para implementar essa estrutura de
dados em JAVA, seguimos o mesmo caminho já trilhado nas aulas anteriores.