estrutura de dados em java - filas
TRANSCRIPT
![Page 1: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/1.jpg)
Estrutura de DadosListas EncadeadasProf. Adriano Teixeira de Souza
![Page 2: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/2.jpg)
Listas Encadeadas Listas encadeadas ou listas ligadas
representam uma seqüência de objetos na memória do computador.
Exemplo: Lista de afazeres1. 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
![Page 3: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/3.jpg)
Listas Encadeadas
PróximaaçãoAção atual
Na lista de afazeres anterior, uma tarefa dependia da execução da tarefa anterior
![Page 4: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/4.jpg)
Listas Encadeadas
21.
Comprar lâmpada
32. Trocar lâmpada
43.
Procurar conta
54. Pagar conta
65.
Desligar micro
fim6. Dormir
![Page 5: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/5.jpg)
DormirDesligar micro
Pagar conta
Procurar conta
Trocar lâmpad
a
Listas Encadeadas:: Representação por vetores Como representar a lista anterior em um
programa escrito na Linguagem C?◦ Primeira opção: vetores ou matrizes
Comprar
lâmpada
Tarefa:
Índice: 1 2 3 4 5 6
![Page 6: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/6.jpg)
Listas Encadeadas:: Representação por vetores Primeira opção: vetores ou matrizes
◦ Como acrescentar “Ligar micro”?
DormirDesligar micro
Pagar contaLigar micro
Procurar conta
Trocar lâmpad
a
Comprar
lâmpada
Tarefa:
Índice: 1 2 3 4 5 6 7
![Page 7: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/7.jpg)
Listas Encadeadas:: Representação por vetores 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.
![Page 8: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/8.jpg)
Listas Encadeadas:: Representação por ponteiros Segunda opção: ponteiros
◦ Estruturas de dados dinâmicas: estruturas de dados que contém ponteiros para si próprias.
class Lista { String nomeTarefa;float duracao;String
responsavel;...Lista prox;
};
class Lista { String nomeTarefa;float duracao;String
responsavel;...Lista prox;
};
Referência para a própria classe Lista
![Page 9: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/9.jpg)
Representação gráfica de um elemento da lista:
◦ Cada item é encadeado com o seguinte, mediante uma variável do tipo ponteiro.
◦ Permite utilizar posições não contíguas de memória.
◦ É possível inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista.
campos de informação
Listas Encadeadas:: Representação por ponteiros
próximo nó
![Page 10: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/10.jpg)
Listas Encadeadas:: Representação por ponteiros Cada item em particular de uma lista pode ser
chamado de elemento, nó, célula, ou item.
O apontador para o início da lista também é tratado como se fosse uma célula (cabeça), para simplificar as operações sobre a lista.
O símbolo / representa o ponteiro nulo (null), indicando o fim da lista.
3 5p
2/4
![Page 11: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/11.jpg)
Operações sobre lista encadeada 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 ponteiros (de um a três elementos).
![Page 12: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/12.jpg)
Operações sobre lista encadeada 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
![Page 13: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/13.jpg)
Prof. Adriano Teixeira de Souza
Criar Lista
class NoLista {
float info;NoLista proximo;
public NoLista(float valor){
this.info = valor;this.proximo = null;
}
}
class NoLista {
float info;NoLista proximo;
public NoLista(float valor){
this.info = valor;this.proximo = null;
}
}
![Page 14: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/14.jpg)
Listas Simplesmente Encadeadas
Para criar a lista propriamente dita, criaremos a classe Lista, que manipula objetos do tipo NoLista
class Lista { NoLista inicio;
public Lista() { this.inicio = null; }
// insere valor no começo da lista
public void inserir(int valor) {...}
// insere valor no fim da lista
public void inserirNoFim(int valor) {...} }
![Page 15: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/15.jpg)
Operações sobre lista encadeada:: Inserção de itens
Podemos inserir itens:◦No início de uma lista◦No final de uma lista◦No meio de uma lista
![Page 16: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/16.jpg)
p 5 2 /4
Operações sobre lista encadeada:: Inserção de itens no início O endereço armazenado no ponteiro p deve
ser alterado para o endereço do item a ser acrescido à lista.
3
![Page 17: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/17.jpg)
Prof. Adriano Teixeira de Souza
Inserção de itens no início
public void inserir(float valor) { if (this.inicio == null) { // lista vazia, então só é preciso criar o nó this.inicio = new NoLista(valor); } else {
// cria-se novo no e atualiza o NoLista inicio NoLista novoNo = new NoLista(valor);
novoNo.proximo = this.inicio;
this.inicio = novoNo; }}
public void inserir(float valor) { if (this.inicio == null) { // lista vazia, então só é preciso criar o nó this.inicio = new NoLista(valor); } else {
// cria-se novo no e atualiza o NoLista inicio NoLista novoNo = new NoLista(valor);
novoNo.proximo = this.inicio;
this.inicio = novoNo; }}
![Page 18: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/18.jpg)
Operações sobre lista encadeada:: Inserção de itens no final
O endereço armazenado em p será alterado caso a lista esteja vazia ou
O campo proximo do último item será alterado.
/3p
/
3 /5p
![Page 19: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/19.jpg)
Prof. Adriano Teixeira de Souza
Inserção de itens no finalpublic void inserirNoFim(int valor) { if (this.inicio == null) { // lista vazia this.inicio = new NoLista(valor); } else { // procura pelo fim da lista NoLista atual = this.inicio; while (atual.proximo != null) atual = atual.proximo; // insere o nó no fim da lista atual.proximo = new NoLista(valor); }}
public void inserirNoFim(int valor) { if (this.inicio == null) { // lista vazia this.inicio = new NoLista(valor); } else { // procura pelo fim da lista NoLista atual = this.inicio; while (atual.proximo != null) atual = atual.proximo; // insere o nó no fim da lista atual.proximo = new NoLista(valor); }}
![Page 20: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/20.jpg)
Operações sobre lista encadeada:: Inserção de itens no meio Campo proximo do item a ser inserido
recebe o campo proximo do item posterior Campo proximo do item antecessor recebe
o endereço do item a ser inserido
2 /4
5
3p
lista[5].proximo ← lista[2]
lista[3].proximo ← 5
lista[5].proximo ← lista[2]
lista[3].proximo ← 5
![Page 21: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/21.jpg)
p 5 2 /4
Operações sobre lista encadeada:: Remoção de itens no início
O endereço armazenado no ponteiro p deve ser alterado para o endereço do item que segue o primeiro item da lista.
![Page 22: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/22.jpg)
Operações sobre lista encadeada:: Remoção de itens no final
O campo proximo do último item será alterado caso a lista contenha mais de um item ou
O endereço armazenado em p será alterado para null caso tenha somente um elemento.
/3p
/
3 /5p
![Page 23: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/23.jpg)
Operações sobre lista encadeada:: Remoção de itens no meio Item antecessor recebe o campo proximo
do item a ser removido
5 2 /43p
lista[3].proximo ← lista[5].proximo
lista[3].proximo ← lista[5].proximo
![Page 24: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/24.jpg)
Função retiravoid retira (float v) {//Em qualquer posicao NoLista ant = null; NoLista p = this.inicio;
while (p != null && p.info != v) { ant = p; p = p.proximo; }
if (p != null){ if (ant == null) {
this.inicio = p.proximo; }else {
ant.proximo = p.proximo; }
};}
void retira (float v) {//Em qualquer posicao NoLista ant = null; NoLista p = this.inicio;
while (p != null && p.info != v) { ant = p; p = p.proximo; }
if (p != null){ if (ant == null) {
this.inicio = p.proximo; }else {
ant.proximo = p.proximo; }
};}
![Page 25: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/25.jpg)
Prof. Adriano Teixeira de Souza
Função de busca
NoLista busca (float v){ int i=0; for (NoLista p = this.inicio; p!=null;
p=p.proximo){ if(p.info == v){ System.out.println("\n\nachou “+i+”\n\n"); return p; } i++; } return null;}
NoLista busca (float v){ int i=0; for (NoLista p = this.inicio; p!=null;
p=p.proximo){ if(p.info == v){ System.out.println("\n\nachou “+i+”\n\n"); return p; } i++; } return null;}
![Page 26: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/26.jpg)
Prof. Adriano Teixeira de Souza
Impressão
void imprime (){ for(NoLista q=this.inicio;q!=null;
q=q.proximo) System.out.println(q.info);
}
void imprime (){ for(NoLista q=this.inicio;q!=null;
q=q.proximo) System.out.println(q.info);
}
![Page 27: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/27.jpg)
Prof. Adriano Teixeira de Souza
Testepublic static void main(String[] args){
Lista l = new Lista();l.inserir(20.0f);l.inserir(44.5f);l.inserir(33.3f);l.inserir(20.9f);l.imprime();NoLista n = l.busca(20.9f);//Buscaif (n != null){
System.out.println("Encontrado:"+n.info); l.retira(n.info);
}System.out.println("Configuracao da lista:");l.imprime();//Libera memorial = null;
}
public static void main(String[] args){
Lista l = new Lista();l.inserir(20.0f);l.inserir(44.5f);l.inserir(33.3f);l.inserir(20.9f);l.imprime();NoLista n = l.busca(20.9f);//Buscaif (n != null){
System.out.println("Encontrado:"+n.info); l.retira(n.info);
}System.out.println("Configuracao da lista:");l.imprime();//Libera memorial = null;
}
![Page 28: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/28.jpg)
Prof. Adriano Teixeira de Souza
Insere ordenadovoid insereOrdenado ( float valor){
NoLista novoNo = new NoLista(valor );
NoLista ant = null; NoLista p = this.inicio;
while (p != null && p.info < valor) { ant = p; p = p.proximo; } if (ant == null) { novoNo.proximo = this.inicio; this.inicio = novoNo; } else { novoNo.proximo = ant.proximo; ant.proximo = novoNo; } }
void insereOrdenado ( float valor){
NoLista novoNo = new NoLista(valor );
NoLista ant = null; NoLista p = this.inicio;
while (p != null && p.info < valor) { ant = p; p = p.proximo; } if (ant == null) { novoNo.proximo = this.inicio; this.inicio = novoNo; } else { novoNo.proximo = ant.proximo; ant.proximo = novoNo; } }
![Page 29: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/29.jpg)
Genéricos Adicionado a C# 2.0 e posteriormente a Java 5 Classes Genéricas, que utilizam o conceito de “parâmetros
tipo”<..> Lista com Genéricos: cada lista armazena um tipo específico, sem
precisar criar código novo para cada tipo
class NoListaI{ int valor; NoLista next;}
class NoListaS{ String nome; NoLista next;}
Sem Genéricos:
Com Genéricos:
class NoLista<E> { E elemento; NoLista<E> next;}
![Page 30: Estrutura de dados em Java - Filas](https://reader034.vdocuments.pub/reader034/viewer/2022050805/558fc7081a28ab744e8b46b3/html5/thumbnails/30.jpg)
Listas com Genéricosclass Lista<E> { NoLista<E> inicio;
public Lista() { this.inicio = null; }
public void inserir(E elemento) { if (this.inicio == null) { this.inicio = new NoLista<E>(elemento); } else {
NoLista<E> novoNo = new NoLista<E>(elemento);
novoNo.next = this.inicio;
this.inicio = novoNo; } }
}