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
Próxima ação
Ação atual
Na lista de afazeres anterior, uma tarefa
dependia da execução da tarefa anterior
2
1. 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
Dormir
Desligar
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:
Primeira opção: vetores ou matrizes
◦
Como acrescentar
“Ligar micro”
?
Dormir
Desligar
micro
Pagar
conta
Ligar
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.
...
...
...
...
...
...
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
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
static void inserir(double valor) { int p = 0; if(listaEstaVazia()) { vetor[p] = valor; tamanho++; } else if(listaEstaCheia()) {
System.out.println("Lista cheia. Não foi possí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 foi possí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
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
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
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
... 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
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
1.4
2.2
3.3
3.5
4.0
...
0 1 2 3 4 5Retirar o elemento 3.5
Elemento encontrado
1.4
2.2
3.3
3.5
4.0
...
0 1 2 3 4 5 p p1.4
2.2
3.3
4.0
...
...
0 1 2 3 4 5
Lista depois da remoção do elemento
3.5
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 encontrado na 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 encontrado na 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 encontrado retira(44.5); // Elemento deletado
retira(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 encontrado retira(44.5); // Elemento deletado
retira(29.4); // Elemento não encontrado
System.out.println("Configuracao da lista:"); imprime();