• Nenhum resultado encontrado

Prof. Jesus José de Oliveira Neto

N/A
N/A
Protected

Academic year: 2021

Share "Prof. Jesus José de Oliveira Neto"

Copied!
34
0
0

Texto

(1)
(2)

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

(3)

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

(4)

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

(5)

Próxima ação

Ação atual

Na lista de afazeres anterior, uma tarefa

dependia da execução da tarefa anterior

(6)

2

1. Comprar

lâmpada

3

2. Trocar

lâmpada

4

3. Procurar

conta

5

4. Pagar

conta

6

5. Desligar

micro

fim

6. Dormir

(7)

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).

(8)

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

(9)

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:

(10)

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

(11)

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.

(12)

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

(13)

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.

(14)

...

...

...

...

...

...

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

(15)

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

(16)

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.");

} ...

(17)

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

(18)

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

(19)

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

(20)

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

(21)

... 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++; } }

(22)

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

(23)

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

(24)

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

(25)

1.4

2.2

3.3

4.0

...

...

0 1 2 3 4 5

Lista depois da remoção do elemento

3.5

(26)

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++; }

(27)

... 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--; } } }

(28)

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; }

(29)

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(); } }

(30)

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

(31)

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); }

(32)

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

(33)

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();

(34)

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

Referências

Documentos relacionados

Os segmentos eleitos foram: biotecnologia (agricultura, floresta, saúde animal, vinicultura, fármacos), tecnologia da informação e comunicação – TIC, indústria

EFEITO DA SUBSTITUIÇÃO DO FENO DE CAPIM TIFTON Cynodon spp POR CASCA DE MAMONA Ricinus communis EM DIETAS A BASE DE PALMA FORRAGEIRA Nopalea cochenilifera Salm Dick SOBRE O PERFIL

Havendo então um limite para o lingüístico, cabe-nos perguntar de que lado do limite estão, por fim, os nomes? Em outras palavras: se um nome está em relação imediata com uma

Em 2004, uma meta-análise avaliando diabéticos obesos tratados clinicamente mostrou uma perda de apenas 4,5kg e somente 22% dos pacientes conseguiram diminuir mais do que 5% do

Pode ser magro e forte e não se achar bonito” (suj. Depende do padrão ideal de casa pessoa. Entre os profissionais, dois compartimentalizam a beleza em “beleza de

schultzei foi maior em plantas não tratadas com extratos Tabela 3, os extratos de Flor de Seda e Juazeiro não apresentou um controle eficaz contra a população dessa praga, pois

A hipótese de que o uso de extratos orgânicos e óleos essenciais de plantas medicinais, pertencentes a diferentes gêneros, por exemplo: Calabura, Piper, Melaleuca e Citrus como

Além disso, foram observados efeitos negativos na expressão de importantes genes hepáticos relacionados à produção de glicose, o que pode expor vacas em lactação a um quadro