Estrutura de
Dados
Divani Barbosa
Aula 9 parte 1
Lista
Definição:
Um tipo de estrutura de dados
(conjunto de dados) dispostos e
acessíveis para remoção e inserção de
itens de maneira dinâmica.
Adicionar ou remover itens em
qualquer ponto.
Cada item é alocado na memória de
maneira individual, sendo assim,
pode crescer (aumentar o tamanho)
conforme o limite de memória
disponível pelo sistema operacional.
Lista Simplesmente
Encadeada
Fonte: http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html
Cada elemento possui um
elo (endereço) para o
próximo elemento.
Lista encadeada simples ou simplesmente
ligada.
class No {
public String item;
public No prox;
}
Classe Nós:
espaço para armazenamento da
informação
Um espaço para armazenar uma
referência da localização na
memória onde o próximo
elemento se encontra.
Definição Nó em Java:
É uma classe que contém um
item de dados e um ou mais elos
(vínculos).
class No {
public String item;
public No prox;
}
4
Sendo que este vínculo funciona como um ponteiro que aponta
para a posição de outro nó na memoria do computador.
ESTRUTURA DE DADOS DO TIPO LISTA SIMPLESMENTE ENCADEADA
(todos os elementos ou nodos)
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Pera
No
PROX = NULL
item = Maçã
No
PROX = null
item = Caju
primeiro ultimo
private No primeiro;
private No ultimo;
Classe ListaSE:
Campos Construtor
public ListaSE() {
primeiro = null;
ultimo = null;
}Métodos
vazio: Retorna verdadeiro se lista vazia.
insere: Insere itens na lista.
insere_fim: Insere itens no final da lista.
pesquisa: Retorna verdadeiro se item
encontrado.
imprime: Imprime lista toda.
apaga: Remove itens.
item_frente: Retorna o primeiro item
public void imprime() {
No atual = primeiro;
while (atual != null) {
System.out.print(" " + atual.item);
atual = atual.prox; // caminhando
}
System.out.println("");
}
Caminhando do
inicio para o
fim da lista
IMPRIME
Entrada: Nenhuma
Saída: Não há
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Caju
No
PROX = null
item = Maçã
primeiro
atual
public void imprime() {
No atual = primeiro;
while (atual != null) {
System.out.print(" " + atual.item);
atual = atual.prox; // caminhando
}
System.out.println("");
}
Caminhando do
inicio para o
fim da lista
IMPRIME
Entrada: Nenhuma
Saída: Não há
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Caju
No
PROX = null
item = Maçã
primeiro
atual
atual
public void imprime() {
No atual = primeiro;
while (atual != null) {
System.out.print(" " + atual.item);
atual = atual.prox; // caminhando
}
System.out.println("");
}
IMPRIME
Entrada: Nenhuma
Saída: Não há
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Caju
No
PROX = null
item = Maçã
primeiro
atual
atual
Caminhando do
inicio para o
fim da lista
public void imprime() {
No atual = primeiro;
while (atual != null) {
System.out.print(" " + atual.item);
atual = atual.prox; // caminhando
}
System.out.println("");
}
IMPRIME
Entrada: Nenhuma
Saída: Não há
No
PROX = NULL
item = Uva
No
PROX= NULL
item = Caju
No
PROX = null
item = Maçã
primeiro
atual = null
Caminhando do
inicio para o
fim da lista
INSERE
public void insere(int pos, String valor) {
if (pos < 0) return; // pos = POSIÇÃO DE INSERÇÃO
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
if(pos == 0) { // se na primeira posição
lista.prox = primeiro;
primeiro = lista;
}
else {
No atual = primeiro;
for(int i=1; i < pos && atual.prox != null; i++)
atual = atual.prox; // posicionando no Nó atual
lista.prox = atual.prox;
atual.prox = lista;
if (lista.prox == null) ultimo = lista; // se ultima posição
}
}
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
No
PROX =
item = Caju
VANTAGEM:
Somente um elo
será alterado.
O restante dos elos
permanecem com o
mesmo conteúdo.
Adicionando
Elementos
INSERE
primeiro ultimo
lista
atual
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
No
PROX =
item = Caju
VANTAGEM:
Somente um elo
será alterado.
O restante dos elos
permanecem com o
mesmo conteúdo.
Adicionando
Elementos
INSERE
primeiro ultimo
lista.prox = atual.prox;
lista
atual
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
No
PROX =
item = Caju
VANTAGEM:
Somente um elo
será alterado.
O restante dos elos
permanecem com o
mesmo conteúdo.
Adicionando
Elementos
INSERE
primeiro ultimo
atual.prox = lista;
lista
atual
public void insere_fim(String valor) {
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
lista.prox = null;
if (vazio()) primeiro = lista;
else ultimo.prox = lista;
ultimo = lista;
}
INSERE NO FIM
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX = null
item = Sal
No
PROX= null
item = Alho
primeiro ultimo lista
INSERE NO FIM
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro ultimo lista
public void insere_fim(String valor) {
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
lista.prox = null;
if (vazio()) primeiro = lista;
else ultimo.prox = lista;
ultimo = lista;
}
INSERE NO FIM
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro
ultimo
lista
public void insere_fim(String valor) {
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
lista.prox = null;
if (vazio()) primeiro = lista;
else ultimo.prox = lista;
ultimo = lista;
}
Caminhando do
inicio para o
fim da lista
public boolean pesquisa(String chave) {
No atual = primeiro;
while (atual != null) {
if (atual.item.equalsIgnoreCase(chave))
return true; // encontrou item
atual = atual.prox; // caminhando
}
return false; // não encontrou item
}
PESQUISA
public boolean vazio() { return (primeiro==null); }
public String item_frente() { return primeiro.item; }
VAZIO e ITEM FRENTE
public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) { // caminhando do inicio ao fim da lista
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual;
atual = atual.prox; // caminhando
}
if (atual == null) return;
if (atual == primeiro) {
primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) {
ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox;
atual = null;
}
APAGA
Encontrou item a ser removido
sai do laço while com atual
posicionado nele e anterior
no item anterior ao atual
public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) { // caminhando do inicio ao fim da lista
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual; // posiciona anterior no item anterior ao atual
atual = atual.prox; // caminhando
}
if (atual == null) return; // se não encontrou item sai
if (atual == primeiro) { // se item na primeira posição
primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) { // se item na última posição
ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox; // se item no meio
atual = null;
}
APAGA
public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) {
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual;
atual = atual.prox;
}
if (atual == null) return; // se não encontrou item sai
if (atual == primeiro) {
primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) {
ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox;
atual = null;
}
APAGA
Comandos de posicionamento
dos itens atual e anterior
Comandos responsáveis
por apagar itens
Comando libera item atual da memoria
public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) {
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual;
atual = atual.prox;
}
if (atual == null) return;
if (atual == primeiro) { // se primeiro item
primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) { // se último item
ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox; // se item do meio
atual = null;
}
APAGA
Comando usado nos três casos
Se for apagar o primeiro item
if (atual == primeiro) { primeiro = primeiro.prox;
anterior = null;
}
atual = null;
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro ultimo
atual
anterior
Se for apagar o primeiro item
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro ultimoatual
anterior
if (atual == primeiro) { primeiro = primeiro.prox;
anterior = null;
}
atual = null;
Se for apagar o primeiro item
atual = null
anterior = null
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
primeiro ultimo
if (atual == primeiro) { primeiro = primeiro.prox;
anterior = null;
}
atual = null;
Se for apagar o ultimo item
else if (atual == ultimo) { // se ultimo item
ultimo = anterior;
ultimo.prox = null;
}
atual = null;
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimo
atual
primeiro anterior
Se for apagar o ultimo item
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimo
atualprimeiro anterior
else if (atual == ultimo) { // se ultimo item
ultimo = anterior;
ultimo.prox = null;
}
atual = null;
Se for apagar o ultimo item
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX = null
item = Sal
No
PROX= null
item = Alho
ultimo
atualprimeiro anterior
else if (atual == ultimo) { // se ultimo item
ultimo = anterior;
ultimo.prox = null;
}
atual = null;
Se for apagar o ultimo item
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX = null
item = Sal
ultimo
primeiro anterior
atual = null
else if (atual == ultimo) { // se ultimo item
ultimo = anterior;
ultimo.prox = null;
}
atual = null;
Se for apagar itens do meio
else anterior.prox = atual.prox;
atual = null;
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimoatualprimeiro anterior
Se for apagar itens do meio
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimoatualprimeiro anterior
else anterior.prox = atual.prox;
atual = null;
Se for apagar itens do meio
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX =
item = Sal
No
PROX= null
item = Alho
ultimoatualprimeiro anterior
else anterior.prox = atual.prox;
atual = null;
Se for apagar itens do meio
No
PROX =
item = Uva
No
PROX =
item = Pera
No
PROX= null
item = Alho
ultimoprimeiro anterior
atual = null
else anterior.prox = atual.prox;
atual = null;
Implementação Classe
ListaSE
class ListaSE {
private No primeiro; // referencia ao primeiro Nó da lista
private No ultimo; // referencia ao ultimo Nó da lista
public ListaSE() { primeiro=ultimo=null; } // Construtor
public boolean vazio() { return (primeiro==null); }
public String item_frente() { return primeiro.item; }
public void insere_fim(String valor) {
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
lista.prox = null;
if (vazio()) primeiro = lista;
else ultimo.prox = lista;
ultimo = lista;
} // Continua ...
// Continuação ...
public void insere(int pos, String valor) {
if (pos < 0) return;
No lista = new No(); // Alocando memoria para o Nó
lista.item = valor;
if(pos == 0) {
lista.prox = primeiro;
primeiro = lista;
}
else {
No atual = primeiro;
for(int i=1; i < pos && atual.prox != null; i++)
atual = atual.prox;
lista.prox = atual.prox;
atual.prox = lista;
if (lista.prox == null) ultimo = lista;
}
}
// Continua ...
// Continuação ...
public boolean pesquisa(String chave) {
No atual = primeiro;
while (atual != null) { // caminhando para o fim da lista
if(atual.item.equalsIgnoreCase(chave)) return true;
atual = atual.prox;
}
return false;
}
public void imprime() {
No atual = primeiro;
while (atual != null) { // caminhando para o fim da lista
System.out.print("{" + atual.item + "} ");
atual = atual.prox;
}
System.out.println("");
}
// Continua ...
// Continuação ...
public void apaga(String valor) {
No atual, anterior;
atual = anterior = primeiro;
while (atual != null) { // caminhando para o fim da lista
if (atual.item.equalsIgnoreCase(valor)) break;
anterior = atual;
atual = atual.prox;
}
if (atual == null) return;
if (atual == primeiro) { primeiro = primeiro.prox;
anterior = null;
}
else if (atual == ultimo) { ultimo = anterior;
ultimo.prox = null;
}
else anterior.prox = atual.prox;
atual = null;
}
} // fim da classe ListaSE
Exemplo de uso da Classe ListaSE
class ListaSEApp {
public static void main (String[] args) {
ListaSE l = new ListaSE();
System.out.println(">>> Adicionando ARROZ, FEIJAO, ALFACE no fim");
l.insere_fim("ARROZ"); l.insere_fim("FEIJAO");
l.insere_fim("ALFACE");
System.out.print(" Imprimindo Lista: "); l.imprime();
System.out.println(">>> Adiciona FILE DE FRANGO na posição 1");
l.insere(1,"FILE DE FRANGO");
System.out.print(" Imprimindo Lista: "); l.imprime();
System.out.println(">>> Adiciona TOMATE na posição 3");
l.insere(3,"TOMATE");
System.out.print(" Imprimindo Lista: "); l.imprime();
System.out.println(">>> Removendo FEIJAO");
l.apaga("FEIJAO");
System.out.println(">>> Removendo todos itens do inicio ao fim:");
while (!l.vazio()) { // Enquanto lista não estiver vazia
System.out.println(" Removido {" + l.item_frente() + "}");
l.apaga(l.item_frente());
}
} // fim programa principal
} // fim classe ListaSEApp
Tabela de Estruturas de
Armazenamento
de Propósito Geral
Inserção Eliminação Pesquisa
Vetor O(1) O(n) O(n)
Vetor
Ordenado
O(n) O(n) O(log n)
Lista
Simplesmente
Encadeada
O(1)
fim
O(n)
posição
O(n) O(n)
Atividade
Trabalho 2 - Exercício 3. Reescreva os métodos de
inserção de itens da classe Lista Simplesmente
Encadeada de Strings para que os mesmos não
permitam a inserção de itens já existentes na
lista.
2. Escreva um método para classe Lista Simplesmente
Encadeada que retorne o ultimo item.
3. Escreva um método para classe Lista Simplesmente
Encadeada que remova o ultimo item, chame-o de
remove_ultimo.

Aula 12

  • 1.
  • 2.
    Lista Definição: Um tipo deestrutura de dados (conjunto de dados) dispostos e acessíveis para remoção e inserção de itens de maneira dinâmica. Adicionar ou remover itens em qualquer ponto. Cada item é alocado na memória de maneira individual, sendo assim, pode crescer (aumentar o tamanho) conforme o limite de memória disponível pelo sistema operacional.
  • 3.
    Lista Simplesmente Encadeada Fonte: http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html Cadaelemento possui um elo (endereço) para o próximo elemento. Lista encadeada simples ou simplesmente ligada. class No { public String item; public No prox; } Classe Nós: espaço para armazenamento da informação Um espaço para armazenar uma referência da localização na memória onde o próximo elemento se encontra.
  • 4.
    Definição Nó emJava: É uma classe que contém um item de dados e um ou mais elos (vínculos). class No { public String item; public No prox; } 4 Sendo que este vínculo funciona como um ponteiro que aponta para a posição de outro nó na memoria do computador. ESTRUTURA DE DADOS DO TIPO LISTA SIMPLESMENTE ENCADEADA (todos os elementos ou nodos) No PROX = NULL item = Uva No PROX= NULL item = Pera No PROX = NULL item = Maçã No PROX = null item = Caju primeiro ultimo
  • 5.
    private No primeiro; privateNo ultimo; Classe ListaSE: Campos Construtor public ListaSE() { primeiro = null; ultimo = null; }Métodos vazio: Retorna verdadeiro se lista vazia. insere: Insere itens na lista. insere_fim: Insere itens no final da lista. pesquisa: Retorna verdadeiro se item encontrado. imprime: Imprime lista toda. apaga: Remove itens. item_frente: Retorna o primeiro item
  • 6.
    public void imprime(){ No atual = primeiro; while (atual != null) { System.out.print(" " + atual.item); atual = atual.prox; // caminhando } System.out.println(""); } Caminhando do inicio para o fim da lista IMPRIME Entrada: Nenhuma Saída: Não há No PROX = NULL item = Uva No PROX= NULL item = Caju No PROX = null item = Maçã primeiro atual
  • 7.
    public void imprime(){ No atual = primeiro; while (atual != null) { System.out.print(" " + atual.item); atual = atual.prox; // caminhando } System.out.println(""); } Caminhando do inicio para o fim da lista IMPRIME Entrada: Nenhuma Saída: Não há No PROX = NULL item = Uva No PROX= NULL item = Caju No PROX = null item = Maçã primeiro atual atual
  • 8.
    public void imprime(){ No atual = primeiro; while (atual != null) { System.out.print(" " + atual.item); atual = atual.prox; // caminhando } System.out.println(""); } IMPRIME Entrada: Nenhuma Saída: Não há No PROX = NULL item = Uva No PROX= NULL item = Caju No PROX = null item = Maçã primeiro atual atual Caminhando do inicio para o fim da lista
  • 9.
    public void imprime(){ No atual = primeiro; while (atual != null) { System.out.print(" " + atual.item); atual = atual.prox; // caminhando } System.out.println(""); } IMPRIME Entrada: Nenhuma Saída: Não há No PROX = NULL item = Uva No PROX= NULL item = Caju No PROX = null item = Maçã primeiro atual = null Caminhando do inicio para o fim da lista
  • 10.
    INSERE public void insere(intpos, String valor) { if (pos < 0) return; // pos = POSIÇÃO DE INSERÇÃO No lista = new No(); // Alocando memoria para o Nó lista.item = valor; if(pos == 0) { // se na primeira posição lista.prox = primeiro; primeiro = lista; } else { No atual = primeiro; for(int i=1; i < pos && atual.prox != null; i++) atual = atual.prox; // posicionando no Nó atual lista.prox = atual.prox; atual.prox = lista; if (lista.prox == null) ultimo = lista; // se ultima posição } }
  • 11.
    No PROX = item =Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho No PROX = item = Caju VANTAGEM: Somente um elo será alterado. O restante dos elos permanecem com o mesmo conteúdo. Adicionando Elementos INSERE primeiro ultimo lista atual
  • 12.
    No PROX = item =Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho No PROX = item = Caju VANTAGEM: Somente um elo será alterado. O restante dos elos permanecem com o mesmo conteúdo. Adicionando Elementos INSERE primeiro ultimo lista.prox = atual.prox; lista atual
  • 13.
    No PROX = item =Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho No PROX = item = Caju VANTAGEM: Somente um elo será alterado. O restante dos elos permanecem com o mesmo conteúdo. Adicionando Elementos INSERE primeiro ultimo atual.prox = lista; lista atual
  • 14.
    public void insere_fim(Stringvalor) { No lista = new No(); // Alocando memoria para o Nó lista.item = valor; lista.prox = null; if (vazio()) primeiro = lista; else ultimo.prox = lista; ultimo = lista; } INSERE NO FIM No PROX = item = Uva No PROX = item = Pera No PROX = null item = Sal No PROX= null item = Alho primeiro ultimo lista
  • 15.
    INSERE NO FIM No PROX= item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho primeiro ultimo lista public void insere_fim(String valor) { No lista = new No(); // Alocando memoria para o Nó lista.item = valor; lista.prox = null; if (vazio()) primeiro = lista; else ultimo.prox = lista; ultimo = lista; }
  • 16.
    INSERE NO FIM No PROX= item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho primeiro ultimo lista public void insere_fim(String valor) { No lista = new No(); // Alocando memoria para o Nó lista.item = valor; lista.prox = null; if (vazio()) primeiro = lista; else ultimo.prox = lista; ultimo = lista; }
  • 17.
    Caminhando do inicio parao fim da lista public boolean pesquisa(String chave) { No atual = primeiro; while (atual != null) { if (atual.item.equalsIgnoreCase(chave)) return true; // encontrou item atual = atual.prox; // caminhando } return false; // não encontrou item } PESQUISA public boolean vazio() { return (primeiro==null); } public String item_frente() { return primeiro.item; } VAZIO e ITEM FRENTE
  • 18.
    public void apaga(Stringvalor) { No atual, anterior; atual = anterior = primeiro; while (atual != null) { // caminhando do inicio ao fim da lista if (atual.item.equalsIgnoreCase(valor)) break; anterior = atual; atual = atual.prox; // caminhando } if (atual == null) return; if (atual == primeiro) { primeiro = primeiro.prox; anterior = null; } else if (atual == ultimo) { ultimo = anterior; ultimo.prox = null; } else anterior.prox = atual.prox; atual = null; } APAGA Encontrou item a ser removido sai do laço while com atual posicionado nele e anterior no item anterior ao atual
  • 19.
    public void apaga(Stringvalor) { No atual, anterior; atual = anterior = primeiro; while (atual != null) { // caminhando do inicio ao fim da lista if (atual.item.equalsIgnoreCase(valor)) break; anterior = atual; // posiciona anterior no item anterior ao atual atual = atual.prox; // caminhando } if (atual == null) return; // se não encontrou item sai if (atual == primeiro) { // se item na primeira posição primeiro = primeiro.prox; anterior = null; } else if (atual == ultimo) { // se item na última posição ultimo = anterior; ultimo.prox = null; } else anterior.prox = atual.prox; // se item no meio atual = null; } APAGA
  • 20.
    public void apaga(Stringvalor) { No atual, anterior; atual = anterior = primeiro; while (atual != null) { if (atual.item.equalsIgnoreCase(valor)) break; anterior = atual; atual = atual.prox; } if (atual == null) return; // se não encontrou item sai if (atual == primeiro) { primeiro = primeiro.prox; anterior = null; } else if (atual == ultimo) { ultimo = anterior; ultimo.prox = null; } else anterior.prox = atual.prox; atual = null; } APAGA Comandos de posicionamento dos itens atual e anterior Comandos responsáveis por apagar itens Comando libera item atual da memoria
  • 21.
    public void apaga(Stringvalor) { No atual, anterior; atual = anterior = primeiro; while (atual != null) { if (atual.item.equalsIgnoreCase(valor)) break; anterior = atual; atual = atual.prox; } if (atual == null) return; if (atual == primeiro) { // se primeiro item primeiro = primeiro.prox; anterior = null; } else if (atual == ultimo) { // se último item ultimo = anterior; ultimo.prox = null; } else anterior.prox = atual.prox; // se item do meio atual = null; } APAGA Comando usado nos três casos
  • 22.
    Se for apagaro primeiro item if (atual == primeiro) { primeiro = primeiro.prox; anterior = null; } atual = null; No PROX = item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho primeiro ultimo atual anterior
  • 23.
    Se for apagaro primeiro item No PROX = item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho primeiro ultimoatual anterior if (atual == primeiro) { primeiro = primeiro.prox; anterior = null; } atual = null;
  • 24.
    Se for apagaro primeiro item atual = null anterior = null No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho primeiro ultimo if (atual == primeiro) { primeiro = primeiro.prox; anterior = null; } atual = null;
  • 25.
    Se for apagaro ultimo item else if (atual == ultimo) { // se ultimo item ultimo = anterior; ultimo.prox = null; } atual = null; No PROX = item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho ultimo atual primeiro anterior
  • 26.
    Se for apagaro ultimo item No PROX = item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho ultimo atualprimeiro anterior else if (atual == ultimo) { // se ultimo item ultimo = anterior; ultimo.prox = null; } atual = null;
  • 27.
    Se for apagaro ultimo item No PROX = item = Uva No PROX = item = Pera No PROX = null item = Sal No PROX= null item = Alho ultimo atualprimeiro anterior else if (atual == ultimo) { // se ultimo item ultimo = anterior; ultimo.prox = null; } atual = null;
  • 28.
    Se for apagaro ultimo item No PROX = item = Uva No PROX = item = Pera No PROX = null item = Sal ultimo primeiro anterior atual = null else if (atual == ultimo) { // se ultimo item ultimo = anterior; ultimo.prox = null; } atual = null;
  • 29.
    Se for apagaritens do meio else anterior.prox = atual.prox; atual = null; No PROX = item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho ultimoatualprimeiro anterior
  • 30.
    Se for apagaritens do meio No PROX = item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho ultimoatualprimeiro anterior else anterior.prox = atual.prox; atual = null;
  • 31.
    Se for apagaritens do meio No PROX = item = Uva No PROX = item = Pera No PROX = item = Sal No PROX= null item = Alho ultimoatualprimeiro anterior else anterior.prox = atual.prox; atual = null;
  • 32.
    Se for apagaritens do meio No PROX = item = Uva No PROX = item = Pera No PROX= null item = Alho ultimoprimeiro anterior atual = null else anterior.prox = atual.prox; atual = null;
  • 33.
    Implementação Classe ListaSE class ListaSE{ private No primeiro; // referencia ao primeiro Nó da lista private No ultimo; // referencia ao ultimo Nó da lista public ListaSE() { primeiro=ultimo=null; } // Construtor public boolean vazio() { return (primeiro==null); } public String item_frente() { return primeiro.item; } public void insere_fim(String valor) { No lista = new No(); // Alocando memoria para o Nó lista.item = valor; lista.prox = null; if (vazio()) primeiro = lista; else ultimo.prox = lista; ultimo = lista; } // Continua ...
  • 34.
    // Continuação ... publicvoid insere(int pos, String valor) { if (pos < 0) return; No lista = new No(); // Alocando memoria para o Nó lista.item = valor; if(pos == 0) { lista.prox = primeiro; primeiro = lista; } else { No atual = primeiro; for(int i=1; i < pos && atual.prox != null; i++) atual = atual.prox; lista.prox = atual.prox; atual.prox = lista; if (lista.prox == null) ultimo = lista; } } // Continua ...
  • 35.
    // Continuação ... publicboolean pesquisa(String chave) { No atual = primeiro; while (atual != null) { // caminhando para o fim da lista if(atual.item.equalsIgnoreCase(chave)) return true; atual = atual.prox; } return false; } public void imprime() { No atual = primeiro; while (atual != null) { // caminhando para o fim da lista System.out.print("{" + atual.item + "} "); atual = atual.prox; } System.out.println(""); } // Continua ...
  • 36.
    // Continuação ... publicvoid apaga(String valor) { No atual, anterior; atual = anterior = primeiro; while (atual != null) { // caminhando para o fim da lista if (atual.item.equalsIgnoreCase(valor)) break; anterior = atual; atual = atual.prox; } if (atual == null) return; if (atual == primeiro) { primeiro = primeiro.prox; anterior = null; } else if (atual == ultimo) { ultimo = anterior; ultimo.prox = null; } else anterior.prox = atual.prox; atual = null; } } // fim da classe ListaSE
  • 37.
    Exemplo de usoda Classe ListaSE class ListaSEApp { public static void main (String[] args) { ListaSE l = new ListaSE(); System.out.println(">>> Adicionando ARROZ, FEIJAO, ALFACE no fim"); l.insere_fim("ARROZ"); l.insere_fim("FEIJAO"); l.insere_fim("ALFACE"); System.out.print(" Imprimindo Lista: "); l.imprime(); System.out.println(">>> Adiciona FILE DE FRANGO na posição 1"); l.insere(1,"FILE DE FRANGO"); System.out.print(" Imprimindo Lista: "); l.imprime(); System.out.println(">>> Adiciona TOMATE na posição 3"); l.insere(3,"TOMATE"); System.out.print(" Imprimindo Lista: "); l.imprime(); System.out.println(">>> Removendo FEIJAO"); l.apaga("FEIJAO"); System.out.println(">>> Removendo todos itens do inicio ao fim:"); while (!l.vazio()) { // Enquanto lista não estiver vazia System.out.println(" Removido {" + l.item_frente() + "}"); l.apaga(l.item_frente()); } } // fim programa principal } // fim classe ListaSEApp
  • 38.
    Tabela de Estruturasde Armazenamento de Propósito Geral Inserção Eliminação Pesquisa Vetor O(1) O(n) O(n) Vetor Ordenado O(n) O(n) O(log n) Lista Simplesmente Encadeada O(1) fim O(n) posição O(n) O(n)
  • 39.
    Atividade Trabalho 2 -Exercício 3. Reescreva os métodos de inserção de itens da classe Lista Simplesmente Encadeada de Strings para que os mesmos não permitam a inserção de itens já existentes na lista. 2. Escreva um método para classe Lista Simplesmente Encadeada que retorne o ultimo item. 3. Escreva um método para classe Lista Simplesmente Encadeada que remova o ultimo item, chame-o de remove_ultimo.