Prof. Jesus José de Oliveira Netoprofessor.pucgoias.edu.br/SiteDocente/admin/arquiv...Os elementos...
Transcript of Prof. Jesus José de Oliveira Netoprofessor.pucgoias.edu.br/SiteDocente/admin/arquiv...Os elementos...
Prof. Jesus José de Oliveira Neto
� Encapsulam a representação dos dados e as operações que podem ser realizadas sobre eles
� Usuário do TAD vs. programador do TAD
◦ Usuário só “enxerga” a interface, não a implementação
◦ Não importa se a representação é feita com palitos, números decimais, ou em binário desde que a gente consiga somar, subtrair, multiplicar, etc.
� Os usuários de um TAD só têm acesso às operações disponibilizadas sobre os dados
� Podemos modificar a implementação do TAD sem modificar o código que usa o TAD
� E vice-versa, podemos modificar o código que usa o TAD sem modificar a implementação do TAD
� TAD pode ser reaproveitado em vários programas
� Listas encadeadas ou listas ligadas representam uma sequência de objetos na memória do computador.
� Exemplo: Lista de afazeres
1. Comprar uma lâmpada
2. Trocar uma lâmpada queimada
3. Procurar uma conta no quarto
4. Pagar uma conta na internet
5. Desligar o computador
6. Dormir
PróximaaçãoAção atual
� Na lista de afazeres anterior, uma tarefa dependia da execução da tarefa anterior
21. Comprar lâmpada
32. Trocar lâmpada
43. Procurar conta
54. Pagar conta
65. Desligar micro
fim6. Dormir
� Podemos realizar algumas operações sobre uma lista encadeadas, tais como:
◦ Inserir itens;
◦ Retirar itens;
◦ Buscar itens.
� Para manter a lista ordenada, após realizar alguma dessas operações, será necessário apenas movimentar alguns elementos (de um a três elementos).
� Outras operações possíveis:
◦ Criar uma lista
◦ Destruir uma lista
◦ Ordenar uma lista
◦ Intercalar duas listas
◦ Concatenar duas listas
◦ Dividir uma lista em duas
◦ Copiar uma lista em outra
DormirDesligar micro
Pagar conta
Procurar conta
Trocar lâmpada
� Como representar a lista anterior em um programa escrito na Linguagem Java?◦ Primeira opção: vetores ou matrizes
Comprar lâmpada
Tarefa:
Índice: 1 2 3 4 5 6
� Primeira opção: vetores ou matrizes◦ Como acrescentar “Ligar micro”?
DormirDesligar micro
Pagar contaLigar micro
Procurar conta
Trocar lâmpada
Comprar lâmpada
Tarefa:
Índice: 1 2 3 4 5 6 7
� Primeira opção: vetores ou matrizes◦ Os itens da lista são armazenados em posições
contíguas de memória.
◦ A lista pode ser percorrida em qualquer direção.
◦ A inserção de um novo item pode ser realizada após o último item com custo constante.
◦ A inserção de um novo item no meio da lista requer um deslocamento de todos os itens localizados após o ponto de inserção.
◦ Retirar um item do início da lista requer um deslocamento de itens para preencher o espaço deixado vazio.
class ListaVetores { static final int MAX = 10;static double vetor[] = new double[MAX];static int tamanho = 0;static int p;...
};
class ListaVetores { static final int MAX = 10;static double vetor[] = new double[MAX];static int tamanho = 0;static int p;...
};
Vetor que armazenará os itens da lista
� Existem três situações a serem consideradas◦ Quando existe espaço no vetor para inserir um
novo elemento;
◦ Quando o vetor está vazio e;
◦ Quando o vetor está cheio.
� Cada situação exige um tratamento diferente
... ... ... ... ... ...
0 1 2 3 4 5
p
� Lista vazia
� Insere elemento 1.7 na posição zero
1.7 ... ... ... ... ...
0 1 2 3 4 5
p
5
� Lista cheia
� Tenta inserir um novo elemento
� Erro! O vetor já está cheio! ◦ O tamanho da lista é igual ao tamanho do vetor◦ Seria necessário remover pelo menos um elemento
da lista
1.4 2.2 3.5 4.0 5.7 9.8
0 1 2 3 4 5
p
static void inserir(double valor){
int p = 0;
if(listaEstaVazia()) {vetor[p] = valor;tamanho++;
}
else if(listaEstaCheia()) {System.out.println("Lista cheia. Não foipossível adicionar novo elemento.");
}...
static void inserir(double valor){
int p = 0;
if(listaEstaVazia()) {vetor[p] = valor;tamanho++;
}
else if(listaEstaCheia()) {System.out.println("Lista cheia. Não foipossível adicionar novo elemento.");
}...
1.4 2.2 3.5 4.0 ... ...
0 1 2 3 4 5
� Exemplo: Lista de tamanho 4
� Novo elemento 3.3
1.4 2.2 3.3 3.5 4.0 ...
0 1 2 3 4 5
p
� Encontrar a posição correta para o elemento 3.3
1.4 2.2 3.5 4.0 ... ...
0 1 2 3 4 5
p
� 3.3 é maior que 1.4
� Então a variável p é deslocada uma posição
� O próximo elemento a ser comparado é 2.2
1.4 2.2 3.5 4.0 ... ...
0 1 2 3 4 5
p
1.4 2.2 3.5 4.0 ... ...
0 1 2 3 4 5
p
� 3.3 é também maior que 2.2
� Mais uma vez a variável p é deslocada uma posição
� O próximo elemento a ser comparado é 3.5
1.4 2.2 3.5 4.0 ... ...
0 1 2 3 4 5
p
1.4 2.2 3.5 4.0 ... ...
0 1 2 3 4 5
p
� 3.3 é menor que 2.2
� O valor 3.3 é colocada na posição onde estava o valor 3.5
� Os demais valores depois de 3.3 são deslocados para direita
1.4 2.2 3.3 3.5 4.0 ...
0 1 2 3 4 5
p
...else {
while(p < tamanho && vetor[p] < valor) {p++;
}
for(int i = tamanho - 1; i >= p; i--) {vetor[i + 1] = vetor[i];
}
vetor[p] = valor;tamanho++;
}}
...else {
while(p < tamanho && vetor[p] < valor) {p++;
}
for(int i = tamanho - 1; i >= p; i--) {vetor[i + 1] = vetor[i];
}
vetor[p] = valor;tamanho++;
}}
� Existem três situações a serem consideradas◦ Quando a lista está vazia
◦ Quando o elemento não é encontrado
◦ Quando o elemento é encontrado e removido
� Cada situação exige um tratamento diferente
� Ao tentar remover um elemento de uma lista vazia, nenhuma ação deve ser realizada◦ Exceto informar que a lista está vazia
� Ao tentar remover um elemento que não se encontra na lista◦ Informar que o elemento não foi encontrado
1.4 2.2 3.3 3.5 4.0 ...
0 1 2 3 4 5
� Retirar o elemento 3.5
� Elemento encontrado
1.4 2.2 3.3 3.5 4.0 ...
0 1 2 3 4 5
p
p
1.4 2.2 3.3 4.0 ... ...
0 1 2 3 4 5
� Lista depois da remoção do elemento 3.5
p
static void retira(double valor){
int p = 0;
if(listaEstaVazia()){
System.out.println("Lista vazia.");}
else{
while(p < MAX && vetor[p] != valor){
p++;}...
static void retira(double valor){
int p = 0;
if(listaEstaVazia()){
System.out.println("Lista vazia.");}
else{
while(p < MAX && vetor[p] != valor){
p++;}...
...if(p == MAX) {
System.out.println("Elemento não encontrado.");
}
else {for(int i = p; i < tamanho - 1; i++) {
vetor[i] = vetor[i + 1];}tamanho--;
}}
}
...if(p == MAX) {
System.out.println("Elemento não encontrado.");
}
else {for(int i = p; i < tamanho - 1; i++) {
vetor[i] = vetor[i + 1];}tamanho--;
}}
}
static double busca(double valor) {if(listaEstaVazia()) {
System.out.println("A lista está vazia.");}
else {for(int i = 0; i < tamanho; i++) {
if(vetor[i] == valor) {System.out.println("Elemento encontradona posição: " + i);
return valor;}
}}return -1;
}
static double busca(double valor) {if(listaEstaVazia()) {
System.out.println("A lista está vazia.");}
else {for(int i = 0; i < tamanho; i++) {
if(vetor[i] == valor) {System.out.println("Elemento encontradona posição: " + i);
return valor;}
}}return -1;
}
static void imprime(){
if(listaEstaVazia()){
System.out.println("A lista está vazia.");}else{
for(int i = 0; i < tamanho; i++){
System.out.print(vetor[i] + " ");}
System.out.println();}
}
static void imprime(){
if(listaEstaVazia()){
System.out.println("A lista está vazia.");}else{
for(int i = 0; i < tamanho; i++){
System.out.print(vetor[i] + " ");}
System.out.println();}
}
static boolean listaEstaVazia(){
return tamanho == 0; }
static boolean listaEstaCheia(){
return tamanho == MAX;}
static boolean listaEstaVazia(){
return tamanho == 0; }
static boolean listaEstaCheia(){
return tamanho == MAX;}
� Métodos que verificam se a lista está cheia ou vazia
public static void main(String[] args){
inserir(20.0f);inserir(44.5f);inserir(33.3f);inserir(20.9f);imprime();
double n = busca(20.9f);//Busca
if (n != -1){System.out.println("Encontrado:"+n);retira(n);
}…
public static void main(String[] args){
inserir(20.0f);inserir(44.5f);inserir(33.3f);inserir(20.9f);imprime();
double n = busca(20.9f);//Busca
if (n != -1){System.out.println("Encontrado:"+n);retira(n);
}…
� O código acima serve para testar as funcionalidades oferecidas pela lista encadeada por vetor
� São inseridos 4 elementos na lista os quais são exibidos na tela
� Em seguida busca-se um determinado elemento que se encontrado então é retirado da lista
…System.out.println("Configuracao da lista:");imprime();
retira(21.9); // Elemento não encontradoretira(44.5); // Elemento deletadoretira(29.4); // Elemento não encontrado
System.out.println("Configuracao da lista:");imprime();
}
…System.out.println("Configuracao da lista:");imprime();
retira(21.9); // Elemento não encontradoretira(44.5); // Elemento deletadoretira(29.4); // Elemento não encontrado
System.out.println("Configuracao da lista:");imprime();
}
� Os elementos da lista são exibidos novamente
� Nota-se que o código tenta retirar elementos que não existem na lista◦ Neste caso, a lista informa que o elemento não foi
encontrado
� A lista é impressa novamente