SlideShare uma empresa Scribd logo
INE5408
Estruturas de Dados
Listas Encadeadas
- Pilhas encadeadas
- Filas encadeadas
- Listas duplamente encadeadas
Extensões do conceito de Lista Encadeada
• A idéia da Lista Encadeada
vista até agora é o modelo
mais geral e simples;
• pode ser especializada e
extendida das mais variadas
formas:
– Especializada:
• Pilhas encadeadas
• Filas
– Extendida:
• Listas Duplamente Encadeadas
• Listas Circulares Simples e
Duplas
3
altura topo
melão
info próximo
maçã
info próximo
uva
info próximo
Pilha Encadeada
Pilhas
20
55
4
12
89
24 A Pilha é uma estrutura de dados
cujo funcionamento é inspirado
no de uma pilha “natural”.
Pilhas usando Vetores
-1
20
55
4
12
89
0
1
2
3
4
24
5
Pilha
cheia
Pilha
vazia
• Vetores possuem um espaço
limitado para armazenar
dados;
• necessitamos definir um
espaço grande o suficiente
para a nossa pilha;
Pilhas Encadeadas
• A estruturas é limitada pela
memória disponível;
• Não é necessário definir um
valor fixo para o tamanho da
Pilha;
3
melão
info próximo
maçã
info próximo
uva
info
nro dados Cabeça
De pilha
Elemento de Pilha
Modelagem: Cabeça de Pilha
• Necessitamos:
– um ponteiro para o primeiro elemento da pilha;
– um inteiro para indicar quantos elementos a pilha
possui.
• Pseudo-código:
classe tPilha {
tElemento *dados;
inteiro tamanho;
};
Modelagem: Elemento de Pilha
• Necessitamos:
– um ponteiro para o próximo elemento da pilha;
– um campo do tipo da informação que vamos
armazenar.
• Pseudo-código:
class tElemento {
tElemento *próximo;
tipo-que-eu-vou-usar-nesta-aplicação info;
};
Modelagem: Elemento de Dados
• Pseudo-código da Classe TipoInfo:
class TipoInfo {
tipo-do-campo1 campo1;
tipo-do-campo2 campo2;
…
tipo-do-campoN campoN;
}
• Local: info.h
Modelagem da Pilha
• Aspecto Funcional:
– colocar e retirar dados da pilha;
– testar se a pilha está vazia;
– testar se a pilha está CHEIA????
– C++.
• Colocar e retirar dados da pilha:
– Empilha(dado)
– Desempilha()
• Testar se a pilha está vazia ou cheia:
– PilhaVazia
• Inicializar ou limpar:
– criaPilha
Algoritmo criaPilha
MÉTODO criaPilha()
//Inicializa a cabeça e o tamanho da
pilha
início
dados <- NULO;
tamanho <- 0;
fim;
Algoritmo PilhaVazia
Booleano MÉTODO pilhaVazia()
início
SE (tamanho = 0) ENTÃO
RETORNE(Verdadeiro)
SENÃO
RETORNE(Falso);
fim;
• Um algoritmo PilhaCheia não existe aqui;
• verificar se houve espaço na memória para um novo elemento
será responsabilidade de cada operação de adição.
Algoritmo Empilha
• Procedimento:
– Alocamos um elemento;
– fazemos o próximo deste novo elemento
ser o primeiro da Pilha;
– fazemos a cabeça de Pilha apontar para o
novo elemento.
• Parâmetros:
– O tipo info (dado) a ser inserido;
Algoritmo Empilha
• Semelhanças????
Algoritmo Empilha =
AdicionaNoInício
2
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
novo
Algoritmo Empilha
2
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
3
Algoritmo Desempilha
• Procedimento:
–testamos se há elementos;
–decrementamos o tamanho;
–liberamos a memória do elemento;
–devolvemos a informação.
Algoritmo Desempilha
• Semelhanças??
Algoritmo Desempilha =
RetiraDoInício
3
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
saiu
volta
Algoritmo Desempilha
3
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
saiu
volta
Algoritmo Desempilha
2
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
saiu
volta
Algoritmo Desempilha
TipoInfo* MÉTODO retiraDoInício()
//Elimina o primeiro elemento de uma pilha.
//Retorna a informação do elemento eliminado ou NULO.
variáveis
tElemento *saiu; //Variável auxiliar para o primeiro
elemento.
TipoInfo *volta; //Variável auxiliar para o dado
retornado.
início
SE (Vazia()) ENTÃO
RETORNE(NULO);
SENÃO
saiu <- dados;
volta <- saiu->info;
dados <- saiu->próximo;
tamanho <- tamanho - 1;
LIBERE(saiu);
RETORNE(volta);
FIM SE
fim;
Filas
• A Fila é uma estrutura de dados que simula uma fila
da vida real.
• Possui duas operações básicas:
– incluir no fim da fila;
– retirar do começo da fila;
– chamada de Estrutura-FIFO:
First-In, First-Out - O primeiro que entrou é o
primeiro a sair…
Fila
Filas
• É uma estrutura de dados importantíssima para:
– gerência de dados/processos por ordem cronológica:
• Fila de impressão em uma impressora de rede;
• Fila de pedidos de uma expedição ou tele-entrega.
– simulação de processos seqüenciais:
• chão de fábrica: fila de camisetas a serem estampadas;
• comércio: simulação de fluxo de um caixa de
supermercado;
• tráfego: simulação de um cruzamento com um semáforo.
Fila
Filas
• É uma estrutura de dados importantíssima para:
– gerência de dados/processos por ordem cronológica:
• Fila de impressão em uma impressora de rede;
• Fila de pedidos de uma expedição ou tele-entrega.
– simulação de processos seqüenciais:
• chão de fábrica: fila de camisetas a serem estampadas;
• comércio: simulação de fluxo de um caixa de
supermercado;
• tráfego: simulação de um cruzamento com um semáforo.
Fila
Filas
• É uma estrutura de dados importantíssima para:
– gerência de dados/processos por ordem cronológica:
• Fila de impressão em uma impressora de rede;
• Fila de pedidos de uma expedição ou tele-entrega.
– simulação de processos seqüenciais:
• chão de fábrica: fila de camisetas a serem estampadas;
• comércio: simulação de fluxo de um caixa de
supermercado;
• tráfego: simulação de um cruzamento com um semáforo.
Fila
Filas
• É uma estrutura de dados importantíssima para:
– gerência de dados/processos por ordem cronológica:
• Fila de impressão em uma impressora de rede;
• Fila de pedidos de uma expedição ou tele-entrega.
– simulação de processos seqüenciais:
• chão de fábrica: fila de camisetas a serem estampadas;
• comércio: simulação de fluxo de um caixa de
supermercado;
• tráfego: simulação de um cruzamento com um semáforo.
Fila
Filas
• É uma estrutura de dados importantíssima para:
– gerência de dados/processos por ordem cronológica:
• Fila de impressão em uma impressora de rede;
• Fila de pedidos de uma expedição ou tele-entrega.
– simulação de processos seqüenciais:
• chão de fábrica: fila de camisetas a serem estampadas;
• comércio: simulação de fluxo de um caixa de
supermercado;
• tráfego: simulação de um cruzamento com um semáforo.
Fila
Filas: representação
• Extensão da lista encadeada:
– referenciamos o último
elemento também;
– adicionamos no fim;
– excluímos do início.
3
melão
info próximo
maçã
info próximo
uva
info próximo
tam início fim Fila
Elemento de Fila
Pseudo-código:
classe tFila {
tElemento *início;
tElemento *fim;
inteiro tamanho;
};
Algoritmo CriaFila
MÉTODO criaFila()
//Inicializa a cabeça e o tamanho da fila
início
inicio <- NULO;
fim <- NULO;
tamanho <- 0;
RETORNE(aFila);
fim;
Algoritmo Adiciona (Fila)
2
melão
info próximo
maçã
info próximo
uva
info próximo
tam início fim
Algoritmo Adiciona (Fila)
2
melão
info próximo
maçã
info próximo
uva
info próximo
tam início fim
Algoritmo Adiciona (Fila)
3
melão
info próximo
maçã
info próximo
uva
info próximo
tam início fim
Algoritmo Adiciona (Fila)
Caso especial: Fila Vazia
0
tam início fim
uva
info próximo
Algoritmo Adiciona (Fila)
Caso especial: Fila Vazia
1
tam início fim
uva
info próximo
Algoritmo Adiciona (Fila)
inteiro MÉTODO adiciona(TipoInfo *dado)
variáveis
tElemento *novo; //Variável auxiliar para o novo elemento.
início
novo <- aloque(tElemento);
SE filaVazia(aFila) ENTÃO
início <- novo
SENÃO
fim->próximo <- novo;
FIM SE
novo->próximo <- NULO;
novo->info <- dado;
fim <- novo;
tamanho <- tamanho + 1;
RETORNE(tamanho);
FIM SE
fim;
Algoritmo Retira (Fila)
3
melão
info próximo
maçã
info próximo
uva
info próximo
tam início fim
sai
Algoritmo Retira (Fila)
3
melão
info próximo
maçã
info próximo
uva
info próximo
tam início fim
sai
Algoritmo Retira (Fila)
2
maçã
info próximo
uva
info próximo
tam início fim
Algoritmo Retira (Fila)
Caso especial: Fila Unitária
1
uva
info próximo
tam início fim
Não preciso de uma variável auxiliar sai.
Algoritmo Retira (Fila)
Caso especial: Fila Unitária
0
tam início fim
Algoritmo RetiraDoInício (Fila)
TipoInfo* MÉTODO retiraDoInício()
//Elimina o primeiro elemento de uma fila.
//Retorna a informação do elemento eliminado ou NULO.
variáveis
tElemento *saiu; //Variável auxiliar para o primeiro elemento.
TipoInfo *volta; //Variável auxiliar para o dado retornado.
início
SE (filaVazia()) ENTÃO
RETORNE(NULO)
SENÃO
saiu <- início;
volta <- saiu->info;
início <- saiu->próximo;
//Se SAIU for o único, próximo é NULO e está certo.
SE (tamanho = 1) ENTÃO
//Fila unitária: devo anular o fim também.
fim <- NULO;
FIM SE
tamanho <- tamanho - 1;
LIBERE(saiu);
RETORNE(volta);
FIM SE
fim;
Listas Duplamente Encadeadas
• A Lista Encadeada e a Fila Encadeada possuem a
desvantagem de somente podermos caminhar em
uma direção:
– vimos que para olhar um elemento pelo qual “acabamos de
passar” precisamos de uma variável auxiliar “anterior”;
– para olhar outros elementos ainda anteriores não temos
nenhum meio, a não ser começar de novo.
• A Lista Duplamente Encadeada é uma estrutura de
lista que permite deslocamento em ambos os
sentidos:
– útil para representar conjuntos de eventos ou objetos a
serem percorridos em dois sentidos;
– ex.: itinerários de ônibus, trem ou avião;
– útil também quando realizamos uma busca aproximada e
nos movemos para a frente e para trás.
Listas Duplamente Encadeadas - Modelagem
3
tam dados
melão
doce
caro
maçã
azeda
cara
uva
irkh
barata
ant info suc ant info suc ant info suc
Modelagem: Cabeça de ListaDupla
• Necessitamos:
– um ponteiro para o primeiro elemento da lista;
– um inteiro para indicar quantos elementos a lista
possui.
• Pseudo-código:
classe tListaDupla {
tElementoDuplo *dados;
inteiro tamanho;
};
Modelagem: Elemento de ListaDupla
• Necessitamos:
– um ponteiro para o elemento anterior na lista;
– um ponteiro para o elemento sucessor na lista;
– um ponteiro para a informação que vamos
armazenar.
• Pseudo-código:
classe tElementoDuplo {
tElementoDuplo *anterior;
tElementoDuplo *sucessor;
TipoInfo *info;
};
Modelagem da Lista Duplamente Encadeada
• Aspecto Funcional:
– colocar e retirar dados da lista;
– testar se a lista está vazia e outros testes;
– inicializá-la e garantir a ordem dos elementos.
3
tam dados
melão
doce
caro
maçã
azeda
cara
uva
irkh
barata
ant info suc ant info suc ant info suc
Modelagem da Lista Duplamente Encadeada
• Operações - colocar e retirar dados da lista:
– AdicionaDuplo(dado)
– AdicionaNoInícioDuplo(dado)
– AdicionaNaPosiçãoDuplo(dado, posição)
– AdicionaEmOrdemDuplo(dado)
– RetiraDuplo()
– RetiraDoInícioDuplo()
– RetiraDaPosiçãoDuplo(posição)
– RetiraEspecíficoDuplo(dado)
Modelagem da Lista Duplamente Encadeada
• Operações - testar a lista e outros testes:
–ListaVaziaDuplo()
–PosiçãoDuplo(dado)
–ContémDuplo(dado)
• Operações - inicializar ou limpar:
–CriaListaDupla()
–DestróiListaDupla()
Algoritmo CriaListaDupla
MÉtodo criaListaDupla()
//Inicializa as variávels
anterior <- NULO;
sucessor <- NULO;
tamanho <- 0;
fim;
Algoritmo ListaVaziaDuplo
Booleano Método listaVaziaDuplo()
início
SE (tamanho = 0) ENTÃO
RETORNE(Verdadeiro)
SENÃO
RETORNE(Falso);
fim;
Algoritmo AdicionaNoInícioDuplo
• Procedimento:
– fazemos o sucessor deste novo elemento ser o
primeiro da lista;
– fazemos o seu antecessor ser NULO;
– fazemos a cabeça de lista apontar para o novo
elemento.
• Parâmetros:
– o dado a ser inserido;
Algoritmo AdicionaNoInícioDuplo
novo
2
tam dados
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
ant info suc ant info suc ant info suc
Algoritmo AdicionaNoInícioDuplo
novo
2
tam dados
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
ant info suc ant info suc ant info suc
Caso novo->suc não seja nulo...
Faço novo->suc->ant ser novo...
Algoritmo AdicionaNoInícioDuplo
novo
3
tam dados
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
ant info suc ant info suc ant info suc
Algoritmo AdicionaNoInícioDuplo
Inteiro MÉTODO adicionaNoInícioDuplo(TipoInfo *dado)
variáveis
tElementoDuplo *novo; //Variável auxiliar para o novo elemento.
início
novo <- aloque(tElementoDuplo);
novo->suc <- dados;
novo->ant <- NULO;
novo->info <- dado;
dados <- novo;
SE (novo->suc ~= NULO) ENTÃO
novo->suc->ant <- novo;
FIM SE;
tamanho <- tamanho + 1;
RETORNE(1);
fim;
Algoritmo RetiraDoInícioDuplo
• Procedimento:
– testamos se há elementos;
– decrementamos o tamanho;
– se o elemento possuir sucessor, o
antecessor do sucessor será NULO;
– liberamos a memória do elemento;
– devolvemos a informação.
Algoritmo RetiraDoInícioDuplo
saiu
volta
3
tam dados
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
ant info suc ant info suc ant info suc
Algoritmo RetiraDoInícioDuplo
saiu
volta
2
tam dados
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
ant info suc ant info suc ant info suc
Algoritmo RetiraDoInícioDuplo
saiu
volta
2
tam dados
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
ant info suc ant info suc ant info suc
Algoritmo RetiraDoInícioDuplo
2
tam dados
maçã
azeda
cara
uva
irkh
barata
ant info suc ant info suc
Algoritmo RetiraDoInícioDuplo
TipoInfo* MÉTODO retiraDoInícioDuplo()
//Elimina o primeiro elemento de uma lista duplamente encadeada.
//Retorna a informação do elemento eliminado ou NULO.
variáveis
tElementoDuplo *saiu; //Variável auxiliar para o primeiro elemento.
TipoInfo *volta; //Variável auxiliar para o dado retornado.
início
SE (listaVaziaDuplo()) ENTÃO
RETORNE(NULO)
SENÃO
saiu <- dados;
volta <- saiu->info;
dados <- saiu->suc;
SE (dados ~= NULO) ENTÃO
dados->ant <- NULO;
FIM SE
tamanho <- tamanho - 1;
LIBERE(saiu);
RETORNE(volta);
FIM SE
fim;
Algoritmo AdicionaNaPosiçãoDuplo
• Praticamente idêntico à lista encadeada;
• procedimento:
– caminhamos até a posição;
– adicionamos o novo dado na posição;
– incrementamos o tamanho.
• Parâmetros:
– o dado a ser inserido;
– a posição onde inserir;
Algoritmo AdicionaNaPosição
Inteiro MÉTODO adicionaNaPosiçãoDuplo(TipoInfo *info, inteiro posição)
//Adiciona novo elemento na posição informada.
//Retorna o novo número de elementos da lista ou erro.
variáveis
tElementoDuplo *novo, *anterior; //Ponteiros auxiliares.
início
SE (posição > tamanho + 1 OU posição < 1) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
SE (posição = 1) ENTÃO
RETORNE(adicionaNoInícioDuplo(info)
SENÃO
novo <- aloque(tElemento);
SE (novo = NULO) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
anterior <- dados;
REPITA (posição - 2) VEZES
anterior <- anterior->suc;
novo->suc <- anterior->suc;
SE (novo->suc ~= NULO ENTÃO //Se o novo não é o último da lista…
novo->suc->ant <- novo; //Seto o antecessor do sucessor do novo.
FIM SE
novo->info <- info;
anterior->suc <- novo;
novo->ant <- anterior;
tamanho <- tamanho + 1;
RETORNE(tamanho);
FIM SE
FIM SE
FIM SE
fim;
Algoritmo RetiraDaPosiçãoDuplo
• Mais simples que na Lista Encadeada;
• procedimento:
– testamos se a posição existe;
– caminhamos até a posição;
– retiramos o dado da posição;
– decrementamos o tamanho.
• Parâmetros:
– a posição de onde retirar;
Algoritmo RetiraDaPosiçãoDuplo
4
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
jaca
irkh
barata
eliminar
Posições > 1
Algoritmo RetiraDaPosiçãoDuplo
Posições > 1
4
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
jaca
irkh
barata
eliminar
Algoritmo RetiraDaPosiçãoDuplo
Posições > 1
3
maçã
azeda
cara
uva
irkh
barata
melão
doce
caro
jaca
irkh
barata
eliminar
Algoritmo RetiraDaPosiçãoDuplo
Posições > 1
3
maçã
azeda
cara
melão
doce
caro
jaca
irkh
barata
Algoritmo RetiraDaPosiçãoDuplo
TipoInfo* MÉTODO retiraDaPosiçãoDuplo(inteiro posição)
//Elimina o elemento da posição informada.
//Retorna a informação do elemento eliminado ou NULO.
variáveis
tElementoDuplo *anterior, *eliminar; //Variável auxiliar para elemento.
TipoInfo *volta; //Variável auxiliar para o dado retornado.
início
SE (posição > tamanho OU posição < 1) ENTÃO
RETORNE(NULO)
SENÃO
SE (posição = 1) ENTÃO
RETORNE(retiraDoInícioDuplo())
SENÃO
anterior <- dados;
REPITA (posição - 2) VEZES
anterior <- anterior->suc;
eliminar <- anterior->suc;
volta <- eliminar->info;
anterior->suc <- eliminar->suc;
SE eliminar->suc ~= NULO ENTÃO
eliminar->suc->ant <- anterior;
FIM SE
tamanho <- tamanho - 1;
LIBERE(eliminar);
RETORNE(volta);
FIM SE
FIM SE
fim;
Algoritmo AdicionaEmOrdemDuplo
• Idêntico à lista encadeada;
• procedimento:
– necessitamos de uma função para comparar os
dados (maior);
– procuramos pela posição onde inserir comparando
dados;
– chamamos adicionaNaPosiçãoDuplo().
• Parâmetros:
– o dado a ser inserido.
Algoritmo AdicionaEmOrdemDuplo
Inteiro Método adicionaEmOrdemDuplo(TipoInfo *dado)
variáveis
tElementoDuplo *atual; //Variável auxiliar para caminhar.
inteiro posição;
início
SE (listaVaziaDupla()) ENTÃO
RETORNE(adicionaNoInícioDuplo( dado))
SENÃO
atual <- dados;
posição <- 1;
ENQUANTO (atual->suc ~= NULO E maior(dado, atual->info)) FAÇA
//Encontrar posição para inserir.
atual <- atual->suc;
posição <- posição + 1;
FIM ENQUANTO
SE maior(dado, atual->info) ENTÃO //Parou porque acabou a lista.
RETORNE(adicionaNaPosiçãoDuplo(dado,posição + 1))
SENÃO
RETORNE(adicionaNaPosiçãoDuplo(dado, posição));
FIM SE
FIM SE
fim;
Algoritmos restantes
Lista Duplamente Encadeada
Por conta do aluno:
• operações de inclusão e exclusão:
–AdicionaDuplo(dado)
–RetiraDuplo()
–RetiraEspecíficoDuplo(dado)
• Operações - inicializar ou limpar:
–DestróiListaDupla()
Exercício de Implementação 6
Implemente uma Lista de Rotas
utilizando Listas Duplamente
Encadeadas.
Exercício de Implementação 6
• Este programa deverá gerenciar um conjunto de listas de
rotas/linhas de uma companhia de ônibus intermunicipal do
Estado de Santa Catarina;
• todas as rotas se iniciam em Florianópolis;
• cada rota possui um nome que a identifica de forma única, dado
pelo destino. Ex: "Imbituba“;
• cada rota possui a lista de todas as cidades por onde o ônibus
passa, para ir de Florianópolis ao destino;
• a rota de ônibus, ao retornar, passa pelos mesmos lugares.
Portanto, pode ser representada por uma lista duplamente
encadeada;
• o usuário deve poder escolher uma rota e poder navegar por ela,
indo de cidade em cidade e voltando para a cidade anterior,
usando para tanto as teclas de seta à esquerda e seta à direita;
• cada nodo representando uma cidade possui, além do nome, um
texto descrevendo alguma característica desta cidade. Ex.: "Lá
quebram as melhores ondas da costa sul do Brasil". Este texto é
mostrado quando se visita um nodo.
Exercício de Implementação 6
• Implemente o programa de rotas como uma
lista de listas;
• a lista que contém todas as rotas pode ser
uma lista encadeada ou uma lista em vetor;
• cada lista que representa uma rota deve ser
uma lista duplamente encadeada;
• implemente tanto a lista de listas como a lista
duplamente encadeada como uma classe.

Mais conteúdo relacionado

PPT
Aula_05_-_Listas_Duplamente_Encadeadas.ppt
PPT
Aula_01_-_Pilhas_e_Filas_com_Vetores.ppt
ODP
Aula 01 -_pilhas_e_filas_com_vetores-oop
PPTX
PPT
Aula_02_-_Listas_com_Vetores-OOP.ppt
PPT
Aula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
PDF
Slides pilhas e_filas
PDF
Tecnologia em análise e Desenvolvimento de sistemas-fila.pdf
Aula_05_-_Listas_Duplamente_Encadeadas.ppt
Aula_01_-_Pilhas_e_Filas_com_Vetores.ppt
Aula 01 -_pilhas_e_filas_com_vetores-oop
Aula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Slides pilhas e_filas
Tecnologia em análise e Desenvolvimento de sistemas-fila.pdf

Semelhante a Aula_05_-_Listas_Duplamente_Encadeadas_opp.ppt (20)

PDF
Pged 06
PPTX
listasfilaepilhasapresentacaosoftware123
PPTX
PPT
Pilhas e Filas.ppt
PPTX
PPTX
Estrutura de dados
PDF
Pilha e Fila Dinamica
PPTX
PPTX
Estrutura de Dados - Aula 08
PPTX
Estrutura de Dados - Aula 07
PPTX
Aula 10
PDF
Pged 05
PPTX
Pilhas e Filas estrutura de dados 01.pptx
PDF
Listas em estrutura de dados e algoritimos
PDF
Introdução a estruturas de dados com java
PDF
PPT
Pilhas e Filas
PDF
Estrutura de dados - Implementação de filas com listas
Pged 06
listasfilaepilhasapresentacaosoftware123
Pilhas e Filas.ppt
Estrutura de dados
Pilha e Fila Dinamica
Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 07
Aula 10
Pged 05
Pilhas e Filas estrutura de dados 01.pptx
Listas em estrutura de dados e algoritimos
Introdução a estruturas de dados com java
Pilhas e Filas
Estrutura de dados - Implementação de filas com listas
Anúncio

Mais de ssuserd654cb1 (9)

PPTX
Aula sobre Brainstorming 07.09.2022.pptx
PPT
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete (1).ppt
PPT
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.ppt
PPT
Aula_6b_-_Listas_Circulares.ppt
PPT
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).ppt
PPT
Aula_07_Complexidade_de_Algoritmos (1).ppt
PPT
Aula_07_Complexidade_de_Algoritmos.ppt
PPT
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt
PPT
Aula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.ppt
Aula sobre Brainstorming 07.09.2022.pptx
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete (1).ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.ppt
Aula_6b_-_Listas_Circulares.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt
Aula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.ppt
Anúncio

Último (11)

PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Arquitetura de computadores - Memórias Secundárias
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Eng. Software - pontos essenciais para o início
PPTX
Utilizando code blockes por andre backes
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PPTX
Tipos de servidor em redes de computador.pptx
PPTX
Design - Introdução a Gestalt e teoria das formas
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Arquitetura de computadores - Memórias Secundárias
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Eng. Software - pontos essenciais para o início
Utilizando code blockes por andre backes
Viasol Energia Solar -Soluções para geração e economia de energia
Manejo integrado de pragas na cultura do algodão
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Tipos de servidor em redes de computador.pptx
Design - Introdução a Gestalt e teoria das formas

Aula_05_-_Listas_Duplamente_Encadeadas_opp.ppt

  • 1. INE5408 Estruturas de Dados Listas Encadeadas - Pilhas encadeadas - Filas encadeadas - Listas duplamente encadeadas
  • 2. Extensões do conceito de Lista Encadeada • A idéia da Lista Encadeada vista até agora é o modelo mais geral e simples; • pode ser especializada e extendida das mais variadas formas: – Especializada: • Pilhas encadeadas • Filas – Extendida: • Listas Duplamente Encadeadas • Listas Circulares Simples e Duplas 3 altura topo melão info próximo maçã info próximo uva info próximo Pilha Encadeada
  • 3. Pilhas 20 55 4 12 89 24 A Pilha é uma estrutura de dados cujo funcionamento é inspirado no de uma pilha “natural”.
  • 4. Pilhas usando Vetores -1 20 55 4 12 89 0 1 2 3 4 24 5 Pilha cheia Pilha vazia • Vetores possuem um espaço limitado para armazenar dados; • necessitamos definir um espaço grande o suficiente para a nossa pilha;
  • 5. Pilhas Encadeadas • A estruturas é limitada pela memória disponível; • Não é necessário definir um valor fixo para o tamanho da Pilha; 3 melão info próximo maçã info próximo uva info nro dados Cabeça De pilha Elemento de Pilha
  • 6. Modelagem: Cabeça de Pilha • Necessitamos: – um ponteiro para o primeiro elemento da pilha; – um inteiro para indicar quantos elementos a pilha possui. • Pseudo-código: classe tPilha { tElemento *dados; inteiro tamanho; };
  • 7. Modelagem: Elemento de Pilha • Necessitamos: – um ponteiro para o próximo elemento da pilha; – um campo do tipo da informação que vamos armazenar. • Pseudo-código: class tElemento { tElemento *próximo; tipo-que-eu-vou-usar-nesta-aplicação info; };
  • 8. Modelagem: Elemento de Dados • Pseudo-código da Classe TipoInfo: class TipoInfo { tipo-do-campo1 campo1; tipo-do-campo2 campo2; … tipo-do-campoN campoN; } • Local: info.h
  • 9. Modelagem da Pilha • Aspecto Funcional: – colocar e retirar dados da pilha; – testar se a pilha está vazia; – testar se a pilha está CHEIA???? – C++. • Colocar e retirar dados da pilha: – Empilha(dado) – Desempilha() • Testar se a pilha está vazia ou cheia: – PilhaVazia • Inicializar ou limpar: – criaPilha
  • 10. Algoritmo criaPilha MÉTODO criaPilha() //Inicializa a cabeça e o tamanho da pilha início dados <- NULO; tamanho <- 0; fim;
  • 11. Algoritmo PilhaVazia Booleano MÉTODO pilhaVazia() início SE (tamanho = 0) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); fim; • Um algoritmo PilhaCheia não existe aqui; • verificar se houve espaço na memória para um novo elemento será responsabilidade de cada operação de adição.
  • 12. Algoritmo Empilha • Procedimento: – Alocamos um elemento; – fazemos o próximo deste novo elemento ser o primeiro da Pilha; – fazemos a cabeça de Pilha apontar para o novo elemento. • Parâmetros: – O tipo info (dado) a ser inserido;
  • 16. Algoritmo Desempilha • Procedimento: –testamos se há elementos; –decrementamos o tamanho; –liberamos a memória do elemento; –devolvemos a informação.
  • 21. Algoritmo Desempilha TipoInfo* MÉTODO retiraDoInício() //Elimina o primeiro elemento de uma pilha. //Retorna a informação do elemento eliminado ou NULO. variáveis tElemento *saiu; //Variável auxiliar para o primeiro elemento. TipoInfo *volta; //Variável auxiliar para o dado retornado. início SE (Vazia()) ENTÃO RETORNE(NULO); SENÃO saiu <- dados; volta <- saiu->info; dados <- saiu->próximo; tamanho <- tamanho - 1; LIBERE(saiu); RETORNE(volta); FIM SE fim;
  • 22. Filas • A Fila é uma estrutura de dados que simula uma fila da vida real. • Possui duas operações básicas: – incluir no fim da fila; – retirar do começo da fila; – chamada de Estrutura-FIFO: First-In, First-Out - O primeiro que entrou é o primeiro a sair… Fila
  • 23. Filas • É uma estrutura de dados importantíssima para: – gerência de dados/processos por ordem cronológica: • Fila de impressão em uma impressora de rede; • Fila de pedidos de uma expedição ou tele-entrega. – simulação de processos seqüenciais: • chão de fábrica: fila de camisetas a serem estampadas; • comércio: simulação de fluxo de um caixa de supermercado; • tráfego: simulação de um cruzamento com um semáforo. Fila
  • 24. Filas • É uma estrutura de dados importantíssima para: – gerência de dados/processos por ordem cronológica: • Fila de impressão em uma impressora de rede; • Fila de pedidos de uma expedição ou tele-entrega. – simulação de processos seqüenciais: • chão de fábrica: fila de camisetas a serem estampadas; • comércio: simulação de fluxo de um caixa de supermercado; • tráfego: simulação de um cruzamento com um semáforo. Fila
  • 25. Filas • É uma estrutura de dados importantíssima para: – gerência de dados/processos por ordem cronológica: • Fila de impressão em uma impressora de rede; • Fila de pedidos de uma expedição ou tele-entrega. – simulação de processos seqüenciais: • chão de fábrica: fila de camisetas a serem estampadas; • comércio: simulação de fluxo de um caixa de supermercado; • tráfego: simulação de um cruzamento com um semáforo. Fila
  • 26. Filas • É uma estrutura de dados importantíssima para: – gerência de dados/processos por ordem cronológica: • Fila de impressão em uma impressora de rede; • Fila de pedidos de uma expedição ou tele-entrega. – simulação de processos seqüenciais: • chão de fábrica: fila de camisetas a serem estampadas; • comércio: simulação de fluxo de um caixa de supermercado; • tráfego: simulação de um cruzamento com um semáforo. Fila
  • 27. Filas • É uma estrutura de dados importantíssima para: – gerência de dados/processos por ordem cronológica: • Fila de impressão em uma impressora de rede; • Fila de pedidos de uma expedição ou tele-entrega. – simulação de processos seqüenciais: • chão de fábrica: fila de camisetas a serem estampadas; • comércio: simulação de fluxo de um caixa de supermercado; • tráfego: simulação de um cruzamento com um semáforo. Fila
  • 28. Filas: representação • Extensão da lista encadeada: – referenciamos o último elemento também; – adicionamos no fim; – excluímos do início. 3 melão info próximo maçã info próximo uva info próximo tam início fim Fila Elemento de Fila Pseudo-código: classe tFila { tElemento *início; tElemento *fim; inteiro tamanho; };
  • 29. Algoritmo CriaFila MÉTODO criaFila() //Inicializa a cabeça e o tamanho da fila início inicio <- NULO; fim <- NULO; tamanho <- 0; RETORNE(aFila); fim;
  • 30. Algoritmo Adiciona (Fila) 2 melão info próximo maçã info próximo uva info próximo tam início fim
  • 31. Algoritmo Adiciona (Fila) 2 melão info próximo maçã info próximo uva info próximo tam início fim
  • 32. Algoritmo Adiciona (Fila) 3 melão info próximo maçã info próximo uva info próximo tam início fim
  • 33. Algoritmo Adiciona (Fila) Caso especial: Fila Vazia 0 tam início fim uva info próximo
  • 34. Algoritmo Adiciona (Fila) Caso especial: Fila Vazia 1 tam início fim uva info próximo
  • 35. Algoritmo Adiciona (Fila) inteiro MÉTODO adiciona(TipoInfo *dado) variáveis tElemento *novo; //Variável auxiliar para o novo elemento. início novo <- aloque(tElemento); SE filaVazia(aFila) ENTÃO início <- novo SENÃO fim->próximo <- novo; FIM SE novo->próximo <- NULO; novo->info <- dado; fim <- novo; tamanho <- tamanho + 1; RETORNE(tamanho); FIM SE fim;
  • 36. Algoritmo Retira (Fila) 3 melão info próximo maçã info próximo uva info próximo tam início fim sai
  • 37. Algoritmo Retira (Fila) 3 melão info próximo maçã info próximo uva info próximo tam início fim sai
  • 38. Algoritmo Retira (Fila) 2 maçã info próximo uva info próximo tam início fim
  • 39. Algoritmo Retira (Fila) Caso especial: Fila Unitária 1 uva info próximo tam início fim Não preciso de uma variável auxiliar sai.
  • 40. Algoritmo Retira (Fila) Caso especial: Fila Unitária 0 tam início fim
  • 41. Algoritmo RetiraDoInício (Fila) TipoInfo* MÉTODO retiraDoInício() //Elimina o primeiro elemento de uma fila. //Retorna a informação do elemento eliminado ou NULO. variáveis tElemento *saiu; //Variável auxiliar para o primeiro elemento. TipoInfo *volta; //Variável auxiliar para o dado retornado. início SE (filaVazia()) ENTÃO RETORNE(NULO) SENÃO saiu <- início; volta <- saiu->info; início <- saiu->próximo; //Se SAIU for o único, próximo é NULO e está certo. SE (tamanho = 1) ENTÃO //Fila unitária: devo anular o fim também. fim <- NULO; FIM SE tamanho <- tamanho - 1; LIBERE(saiu); RETORNE(volta); FIM SE fim;
  • 42. Listas Duplamente Encadeadas • A Lista Encadeada e a Fila Encadeada possuem a desvantagem de somente podermos caminhar em uma direção: – vimos que para olhar um elemento pelo qual “acabamos de passar” precisamos de uma variável auxiliar “anterior”; – para olhar outros elementos ainda anteriores não temos nenhum meio, a não ser começar de novo. • A Lista Duplamente Encadeada é uma estrutura de lista que permite deslocamento em ambos os sentidos: – útil para representar conjuntos de eventos ou objetos a serem percorridos em dois sentidos; – ex.: itinerários de ônibus, trem ou avião; – útil também quando realizamos uma busca aproximada e nos movemos para a frente e para trás.
  • 43. Listas Duplamente Encadeadas - Modelagem 3 tam dados melão doce caro maçã azeda cara uva irkh barata ant info suc ant info suc ant info suc
  • 44. Modelagem: Cabeça de ListaDupla • Necessitamos: – um ponteiro para o primeiro elemento da lista; – um inteiro para indicar quantos elementos a lista possui. • Pseudo-código: classe tListaDupla { tElementoDuplo *dados; inteiro tamanho; };
  • 45. Modelagem: Elemento de ListaDupla • Necessitamos: – um ponteiro para o elemento anterior na lista; – um ponteiro para o elemento sucessor na lista; – um ponteiro para a informação que vamos armazenar. • Pseudo-código: classe tElementoDuplo { tElementoDuplo *anterior; tElementoDuplo *sucessor; TipoInfo *info; };
  • 46. Modelagem da Lista Duplamente Encadeada • Aspecto Funcional: – colocar e retirar dados da lista; – testar se a lista está vazia e outros testes; – inicializá-la e garantir a ordem dos elementos. 3 tam dados melão doce caro maçã azeda cara uva irkh barata ant info suc ant info suc ant info suc
  • 47. Modelagem da Lista Duplamente Encadeada • Operações - colocar e retirar dados da lista: – AdicionaDuplo(dado) – AdicionaNoInícioDuplo(dado) – AdicionaNaPosiçãoDuplo(dado, posição) – AdicionaEmOrdemDuplo(dado) – RetiraDuplo() – RetiraDoInícioDuplo() – RetiraDaPosiçãoDuplo(posição) – RetiraEspecíficoDuplo(dado)
  • 48. Modelagem da Lista Duplamente Encadeada • Operações - testar a lista e outros testes: –ListaVaziaDuplo() –PosiçãoDuplo(dado) –ContémDuplo(dado) • Operações - inicializar ou limpar: –CriaListaDupla() –DestróiListaDupla()
  • 49. Algoritmo CriaListaDupla MÉtodo criaListaDupla() //Inicializa as variávels anterior <- NULO; sucessor <- NULO; tamanho <- 0; fim;
  • 50. Algoritmo ListaVaziaDuplo Booleano Método listaVaziaDuplo() início SE (tamanho = 0) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); fim;
  • 51. Algoritmo AdicionaNoInícioDuplo • Procedimento: – fazemos o sucessor deste novo elemento ser o primeiro da lista; – fazemos o seu antecessor ser NULO; – fazemos a cabeça de lista apontar para o novo elemento. • Parâmetros: – o dado a ser inserido;
  • 53. Algoritmo AdicionaNoInícioDuplo novo 2 tam dados maçã azeda cara uva irkh barata melão doce caro ant info suc ant info suc ant info suc Caso novo->suc não seja nulo... Faço novo->suc->ant ser novo...
  • 55. Algoritmo AdicionaNoInícioDuplo Inteiro MÉTODO adicionaNoInícioDuplo(TipoInfo *dado) variáveis tElementoDuplo *novo; //Variável auxiliar para o novo elemento. início novo <- aloque(tElementoDuplo); novo->suc <- dados; novo->ant <- NULO; novo->info <- dado; dados <- novo; SE (novo->suc ~= NULO) ENTÃO novo->suc->ant <- novo; FIM SE; tamanho <- tamanho + 1; RETORNE(1); fim;
  • 56. Algoritmo RetiraDoInícioDuplo • Procedimento: – testamos se há elementos; – decrementamos o tamanho; – se o elemento possuir sucessor, o antecessor do sucessor será NULO; – liberamos a memória do elemento; – devolvemos a informação.
  • 61. Algoritmo RetiraDoInícioDuplo TipoInfo* MÉTODO retiraDoInícioDuplo() //Elimina o primeiro elemento de uma lista duplamente encadeada. //Retorna a informação do elemento eliminado ou NULO. variáveis tElementoDuplo *saiu; //Variável auxiliar para o primeiro elemento. TipoInfo *volta; //Variável auxiliar para o dado retornado. início SE (listaVaziaDuplo()) ENTÃO RETORNE(NULO) SENÃO saiu <- dados; volta <- saiu->info; dados <- saiu->suc; SE (dados ~= NULO) ENTÃO dados->ant <- NULO; FIM SE tamanho <- tamanho - 1; LIBERE(saiu); RETORNE(volta); FIM SE fim;
  • 62. Algoritmo AdicionaNaPosiçãoDuplo • Praticamente idêntico à lista encadeada; • procedimento: – caminhamos até a posição; – adicionamos o novo dado na posição; – incrementamos o tamanho. • Parâmetros: – o dado a ser inserido; – a posição onde inserir;
  • 63. Algoritmo AdicionaNaPosição Inteiro MÉTODO adicionaNaPosiçãoDuplo(TipoInfo *info, inteiro posição) //Adiciona novo elemento na posição informada. //Retorna o novo número de elementos da lista ou erro. variáveis tElementoDuplo *novo, *anterior; //Ponteiros auxiliares. início SE (posição > tamanho + 1 OU posição < 1) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO SE (posição = 1) ENTÃO RETORNE(adicionaNoInícioDuplo(info) SENÃO novo <- aloque(tElemento); SE (novo = NULO) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO anterior <- dados; REPITA (posição - 2) VEZES anterior <- anterior->suc; novo->suc <- anterior->suc; SE (novo->suc ~= NULO ENTÃO //Se o novo não é o último da lista… novo->suc->ant <- novo; //Seto o antecessor do sucessor do novo. FIM SE novo->info <- info; anterior->suc <- novo; novo->ant <- anterior; tamanho <- tamanho + 1; RETORNE(tamanho); FIM SE FIM SE FIM SE fim;
  • 64. Algoritmo RetiraDaPosiçãoDuplo • Mais simples que na Lista Encadeada; • procedimento: – testamos se a posição existe; – caminhamos até a posição; – retiramos o dado da posição; – decrementamos o tamanho. • Parâmetros: – a posição de onde retirar;
  • 66. Algoritmo RetiraDaPosiçãoDuplo Posições > 1 4 maçã azeda cara uva irkh barata melão doce caro jaca irkh barata eliminar
  • 67. Algoritmo RetiraDaPosiçãoDuplo Posições > 1 3 maçã azeda cara uva irkh barata melão doce caro jaca irkh barata eliminar
  • 68. Algoritmo RetiraDaPosiçãoDuplo Posições > 1 3 maçã azeda cara melão doce caro jaca irkh barata
  • 69. Algoritmo RetiraDaPosiçãoDuplo TipoInfo* MÉTODO retiraDaPosiçãoDuplo(inteiro posição) //Elimina o elemento da posição informada. //Retorna a informação do elemento eliminado ou NULO. variáveis tElementoDuplo *anterior, *eliminar; //Variável auxiliar para elemento. TipoInfo *volta; //Variável auxiliar para o dado retornado. início SE (posição > tamanho OU posição < 1) ENTÃO RETORNE(NULO) SENÃO SE (posição = 1) ENTÃO RETORNE(retiraDoInícioDuplo()) SENÃO anterior <- dados; REPITA (posição - 2) VEZES anterior <- anterior->suc; eliminar <- anterior->suc; volta <- eliminar->info; anterior->suc <- eliminar->suc; SE eliminar->suc ~= NULO ENTÃO eliminar->suc->ant <- anterior; FIM SE tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta); FIM SE FIM SE fim;
  • 70. Algoritmo AdicionaEmOrdemDuplo • Idêntico à lista encadeada; • procedimento: – necessitamos de uma função para comparar os dados (maior); – procuramos pela posição onde inserir comparando dados; – chamamos adicionaNaPosiçãoDuplo(). • Parâmetros: – o dado a ser inserido.
  • 71. Algoritmo AdicionaEmOrdemDuplo Inteiro Método adicionaEmOrdemDuplo(TipoInfo *dado) variáveis tElementoDuplo *atual; //Variável auxiliar para caminhar. inteiro posição; início SE (listaVaziaDupla()) ENTÃO RETORNE(adicionaNoInícioDuplo( dado)) SENÃO atual <- dados; posição <- 1; ENQUANTO (atual->suc ~= NULO E maior(dado, atual->info)) FAÇA //Encontrar posição para inserir. atual <- atual->suc; posição <- posição + 1; FIM ENQUANTO SE maior(dado, atual->info) ENTÃO //Parou porque acabou a lista. RETORNE(adicionaNaPosiçãoDuplo(dado,posição + 1)) SENÃO RETORNE(adicionaNaPosiçãoDuplo(dado, posição)); FIM SE FIM SE fim;
  • 72. Algoritmos restantes Lista Duplamente Encadeada Por conta do aluno: • operações de inclusão e exclusão: –AdicionaDuplo(dado) –RetiraDuplo() –RetiraEspecíficoDuplo(dado) • Operações - inicializar ou limpar: –DestróiListaDupla()
  • 73. Exercício de Implementação 6 Implemente uma Lista de Rotas utilizando Listas Duplamente Encadeadas.
  • 74. Exercício de Implementação 6 • Este programa deverá gerenciar um conjunto de listas de rotas/linhas de uma companhia de ônibus intermunicipal do Estado de Santa Catarina; • todas as rotas se iniciam em Florianópolis; • cada rota possui um nome que a identifica de forma única, dado pelo destino. Ex: "Imbituba“; • cada rota possui a lista de todas as cidades por onde o ônibus passa, para ir de Florianópolis ao destino; • a rota de ônibus, ao retornar, passa pelos mesmos lugares. Portanto, pode ser representada por uma lista duplamente encadeada; • o usuário deve poder escolher uma rota e poder navegar por ela, indo de cidade em cidade e voltando para a cidade anterior, usando para tanto as teclas de seta à esquerda e seta à direita; • cada nodo representando uma cidade possui, além do nome, um texto descrevendo alguma característica desta cidade. Ex.: "Lá quebram as melhores ondas da costa sul do Brasil". Este texto é mostrado quando se visita um nodo.
  • 75. Exercício de Implementação 6 • Implemente o programa de rotas como uma lista de listas; • a lista que contém todas as rotas pode ser uma lista encadeada ou uma lista em vetor; • cada lista que representa uma rota deve ser uma lista duplamente encadeada; • implemente tanto a lista de listas como a lista duplamente encadeada como uma classe.