SlideShare uma empresa Scribd logo
1 de 75
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

Semelhante a Listas encadeadas, filas e pilhas

PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosPROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosFabrízio Mello
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopAlexei Znamensky
 
Data warehouse & olap
Data warehouse & olapData warehouse & olap
Data warehouse & olapBrian Supra
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosFabrízio Mello
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQLEuler Taveira
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisFabrício Lopes Sanchez
 
Estrutura de Dados - Aula 07
Estrutura de Dados - Aula 07Estrutura de Dados - Aula 07
Estrutura de Dados - Aula 07thomasdacosta
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosFabrízio Mello
 
Aula 03 - Identificando e tratando padrões
Aula 03 - Identificando e tratando padrõesAula 03 - Identificando e tratando padrões
Aula 03 - Identificando e tratando padrõesDalton Martins
 
Estrutura de Dados - Aula 05 - Filas Estáticas
Estrutura de Dados - Aula 05 - Filas EstáticasEstrutura de Dados - Aula 05 - Filas Estáticas
Estrutura de Dados - Aula 05 - Filas EstáticasLeinylson Fontinele
 
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOS
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOSLIVRO PROPRIETÁRIO - ESTRUTURA DE DADOS
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOSOs Fantasmas !
 
Análise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoAnálise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoGustavo Carvalho
 

Semelhante a Listas encadeadas, filas e pilhas (20)

Pged 06
Pged 06Pged 06
Pged 06
 
Pilha e Fila Dinamica
Pilha e Fila DinamicaPilha e Fila Dinamica
Pilha e Fila Dinamica
 
Aula 3-lógica.pptx
Aula 3-lógica.pptxAula 3-lógica.pptx
Aula 3-lógica.pptx
 
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosPROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl Workshop
 
Ordenação
OrdenaçãoOrdenação
Ordenação
 
Pged 05
Pged 05Pged 05
Pged 05
 
Data warehouse & olap
Data warehouse & olapData warehouse & olap
Data warehouse & olap
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQL
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentais
 
Estrutura de Dados - Aula 07
Estrutura de Dados - Aula 07Estrutura de Dados - Aula 07
Estrutura de Dados - Aula 07
 
Programação aula002
Programação aula002Programação aula002
Programação aula002
 
Apostila Intensivo Python - Desafio 2.pdf
Apostila Intensivo Python - Desafio 2.pdfApostila Intensivo Python - Desafio 2.pdf
Apostila Intensivo Python - Desafio 2.pdf
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
Aula 03 - Identificando e tratando padrões
Aula 03 - Identificando e tratando padrõesAula 03 - Identificando e tratando padrões
Aula 03 - Identificando e tratando padrões
 
Estrutura de Dados - Aula 05 - Filas Estáticas
Estrutura de Dados - Aula 05 - Filas EstáticasEstrutura de Dados - Aula 05 - Filas Estáticas
Estrutura de Dados - Aula 05 - Filas Estáticas
 
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOS
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOSLIVRO PROPRIETÁRIO - ESTRUTURA DE DADOS
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOS
 
Análise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoAnálise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenação
 
P910Aula07
P910Aula07P910Aula07
P910Aula07
 

Mais de ssuserd654cb1

Aula sobre Brainstorming 07.09.2022.pptx
Aula sobre Brainstorming 07.09.2022.pptxAula sobre Brainstorming 07.09.2022.pptx
Aula sobre Brainstorming 07.09.2022.pptxssuserd654cb1
 
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 (1).pptAula_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 (1).pptssuserd654cb1
 
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.pptAula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.pptssuserd654cb1
 
Aula_6b_-_Listas_Circulares.ppt
Aula_6b_-_Listas_Circulares.pptAula_6b_-_Listas_Circulares.ppt
Aula_6b_-_Listas_Circulares.pptssuserd654cb1
 
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).pptAula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).pptssuserd654cb1
 
Aula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP.pptAula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP.pptssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptssuserd654cb1
 
Aula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.pptAula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.pptssuserd654cb1
 
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.pptAula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.pptssuserd654cb1
 
Aula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.ppt
Aula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.pptAula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.ppt
Aula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.pptssuserd654cb1
 

Mais de ssuserd654cb1 (11)

Aula sobre Brainstorming 07.09.2022.pptx
Aula sobre Brainstorming 07.09.2022.pptxAula sobre Brainstorming 07.09.2022.pptx
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 (1).pptAula_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 (1).ppt
 
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.pptAula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria_new_delete.ppt
 
Aula_6b_-_Listas_Circulares.ppt
Aula_6b_-_Listas_Circulares.pptAula_6b_-_Listas_Circulares.ppt
Aula_6b_-_Listas_Circulares.ppt
 
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).pptAula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria (1).ppt
 
Aula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP.pptAula_02_-_Listas_com_Vetores-OOP.ppt
Aula_02_-_Listas_com_Vetores-OOP.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.pptAula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
Aula_02_-_Listas_com_Vetores-OOP_2011_2.ppt
 
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.pptAula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt
Aula_03_-_2_-_Aloca_o_Din_mica_de_Mem_ria.ppt
 
Aula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.ppt
Aula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.pptAula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.ppt
Aula_01_-_Apresenta_o_e_Programa_da_Disciplina_2012-1.ppt
 

Listas encadeadas, filas e pilhas

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