SlideShare uma empresa Scribd logo
1 de 58
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 Encadeadas
• São pilhas onde os elementos são
encadeados;
– não há estouro de pilha;
– como o acesso de dados na pilha
é puramente seqüencial, não há
perda de eficiência.
• Existem apenas duas operações:
– Empilhar: equivale a adicionar no
início.
– Desempilhar: equivale a retirar do
início.
• É a forma como tradicionalmente
pilhas são implementadas.
3
altura topo
melão
info próximo
maçã
info próximo
uva
info próximo
Pilha Encadeada
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:
tipo tFila {
tElemento *início;
tElemento *fim;
inteiro tamanho;
};
Algoritmo CriaFila
tFila* FUNÇÃO criaFila()
//Retorna ponteiro para uma nova cabeça de fila ou NULO.
variáveis
tFila *aFila;
início
aFila <- aloque(tFila);
SE (aFila ~= NULO) ENTÃO
//Só posso inicializar se consegui alocar.
aFila->tamanho <- 0;
aFila->início <- NULO;
aFila->fim <- NULO;
FIM SE
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 FUNÇÃO adiciona(tFila *aFila, TipoInfo *dado)
variáveis
tElemento *novo; //Variável auxiliar para o novo elemento.
início
novo <- aloque(tElemento);
SE (novo = NULO) ENTÃO
RETORNE(ERROFILACHEIA)
SENÃO
SE filaVazia(aFila) ENTÃO
aFila->início <- novo
SENÃO
aFila->fim->próximo <- novo;
FIM SE
novo->próximo <- NULO;
novo->info <- dado;
aFila->fim <- novo;
aFila->tamanho <- aFila->tamanho + 1;
RETORNE(aFila->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* FUNÇÃO retiraDoInício(tFila *aFila)
//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(aFila)) ENTÃO
RETORNE(NULO)
SENÃO
saiu <- aFila->início;
volta <- saiu->info;
aFila->início <- saiu->próximo;
//Se SAIU for o único, próximo é NULO e está certo.
SE (aFila->tamanho = 1) ENTÃO
//Fila unitária: devo anular o fim também.
aFila->fim <- NULO;
FIM SE
aFila->tamanho <- aFila->tamanho - 1;
LIBERE(saiu);
RETORNE(volta);
FIM SE
fim;
Exercício com Filas
• Implemente o TAD Fila Encadeada com as suas duas
operações de manipulação;
• implemente um programa principal de aplicação que
utilize uma fila para:
– ler dados de pedidos de solicitação de conserto de
computadores da marca HAL pela sua assistência técnica
AssistHAL;
– utilize o seguinte TipoInfo: nome do solicitante, telefone, data
da entrega (inserida automaticamente), modelo do
computador e valor do conserto, que é um valor chutado.
• Após cadastrado um pedido, o sistema deverá
informar quando o solicitante poderá contar com o
computador pronto, sendo que:
– a oficina AssistHAL leva em média duas semanas por
pedido.
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:
tipo 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:
tipo 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(listaDupla, dado)
– AdicionaNoInícioDuplo(listaDupla, dado)
– AdicionaNaPosiçãoDuplo(listaDupla, dado,
posição)
– AdicionaEmOrdemDuplo(listaDupla, dado)
– RetiraDuplo(listaDupla)
– RetiraDoInícioDuplo(listaDupla)
– RetiraDaPosiçãoDuplo(listaDupla, posição)
– RetiraEspecíficoDuplo(listaDupla, dado)
Modelagem da Lista Duplamente Encadeada
• Operações - testar a lista e outros testes:
–ListaVaziaDuplo(listaDupla)
–PosiçãoDuplo(listaDupla, dado)
–ContémDuplo(listaDupla, dado)
• Operações - inicializar ou limpar:
–CriaListaDupla()
–DestróiListaDupla(listaDupla)
Algoritmo CriaListaDupla
tListaDupla* FUNÇÃO criaListaDupla()
//Retorna ponteiro para uma nova cabeça de lista ou NULO.
variáveis
tListaDupla *aLista;
início
aLista <- aloque(tListaDupla);
SE (aLista ~= NULO) ENTÃO
//Só posso inicializar se consegui alocar.
aLista->tamanho <- 0;
aLista->dados <- NULO;
FIM SE
RETORNE(aLista);
fim;
Algoritmo ListaVaziaDuplo
Booleano FUNÇÃO listaVaziaDuplo(tListaDupla
*aLista)
início
SE (aLista->tamanho = 0) ENTÃO
RETORNE(Verdadeiro)
SENÃO
RETORNE(Falso);
fim;
Algoritmo AdicionaNoInícioDuplo
• Procedimento:
– testamos se é possível alocar um elemento;
– 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;
– a ListaDupla.
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 FUNÇÃO adicionaNoInícioDuplo(tListaDupla *aLista,
TipoInfo *dado)
variáveis
tElementoDuplo *novo; //Variável auxiliar para o novo elemento.
início
novo <- aloque(tElementoDuplo);
SE (novo = NULO) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
novo->suc <- aLista->dados;
novo->ant <- NULO;
novo->info <- dado;
aLista->dados <- novo;
SE (novo->suc ~= NULO) ENTÃO
novo->suc->ant <- novo;
FIM SE;
aLista->tamanho <- aLista->tamanho + 1;
RETORNE(1);
FIM SE
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.
• Parâmetros:
– a ListaDupla.
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* FUNÇÃO retiraDoInícioDuplo(tListaDupla *aLista)
//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(aLista)) ENTÃO
RETORNE(NULO)
SENÃO
saiu <- aLista->dados;
volta <- saiu->info;
aLista->dados <- saiu->suc;
SE (aLista->dados ~= NULO) ENTÃO
aLista->dados->ant <- NULO;
FIM SE
aLista->tamanho <- aLista->tamanho - 1;
LIBERE(saiu);
RETORNE(volta);
FIM SE
fim;
Algoritmo AdicionaNaPosiçãoDuplo
• Praticamente idêntico à lista encadeada;
• procedimento:
– testamos se a posição existe e se é possível
alocar elemento;
– 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;
– a Lista.
Algoritmo AdicionaNaPosição
Inteiro FUNÇÃO adicionaNaPosiçãoDuplo(tListaDupla *aLista, 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 > aLista->tamanho + 1 OU posição < 1) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
SE (posição = 1) ENTÃO
RETORNE(adicionaNoInícioDuplo(aLista, info)
SENÃO
novo <- aloque(tElemento);
SE (novo = NULO) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
anterior <- aLista->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;
aLista->tamanho <- aLista->tamanho + 1;
RETORNE(aLista->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;
– a Lista.
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* FUNÇÃO retiraDaPosiçãoDuplo(tListaDupla *aLista, 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 > aLista->tamanho OU posição < 1) ENTÃO
RETORNE(NULO)
SENÃO
SE (posição = 1) ENTÃO
RETORNE(retiraDoInícioDuplo(aLista))
SENÃO
anterior <- aLista->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
aLista->tamanho <- aLista->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.
– a ListaDupla.
Algoritmo AdicionaEmOrdemDuplo
Inteiro FUNÇÃO adicionaEmOrdemDuplo(tListaDupla *aLista, TipoInfo *dado)
variáveis
tElementoDuplo *atual; //Variável auxiliar para caminhar.
inteiro posição;
início
SE (listaVaziaDupla(aLista)) ENTÃO
RETORNE(adicionaNoInícioDuplo(aLista, dado))
SENÃO
atual <- aLista->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(aLista,dado,posição + 1))
SENÃO
RETORNE(adicionaNaPosiçãoDuplo(aLista, 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(listaDupla, dado)
–RetiraDuplo(listaDupla)
–RetiraEspecíficoDuplo(listaDupla,
dado)
• Operações - inicializar ou limpar:
–DestróiListaDupla(listaDupla)
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 um TAD
separado com todas as suas funções.

Mais conteúdo relacionado

Semelhante a Aula_05_-_Listas_Duplamente_Encadeadas.ppt

Semelhante a Aula_05_-_Listas_Duplamente_Encadeadas.ppt (20)

Estrutura de Dados - Aula 07
Estrutura de Dados - Aula 07Estrutura de Dados - Aula 07
Estrutura de Dados - Aula 07
 
Aula 8.1 - Iptables tabela Filter
Aula 8.1 - Iptables tabela FilterAula 8.1 - Iptables tabela Filter
Aula 8.1 - Iptables tabela Filter
 
Pilha e Fila Dinamica
Pilha e Fila DinamicaPilha e Fila Dinamica
Pilha e Fila Dinamica
 
Pged 06
Pged 06Pged 06
Pged 06
 
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOS
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOSLIVRO PROPRIETÁRIO - ESTRUTURA DE DADOS
LIVRO PROPRIETÁRIO - ESTRUTURA DE DADOS
 
APF
APFAPF
APF
 
Stored Procedures and Triggers
Stored Procedures and TriggersStored Procedures and Triggers
Stored Procedures and Triggers
 
FME - Para que serve?
FME - Para que serve?FME - Para que serve?
FME - Para que serve?
 
Algoritmo e Estrutura de dados em C - Aula 06 - 2019
Algoritmo e Estrutura de dados em C - Aula 06 - 2019Algoritmo e Estrutura de dados em C - Aula 06 - 2019
Algoritmo e Estrutura de dados em C - Aula 06 - 2019
 
Algoritmo e Estrutura de dados em C - Aula 04 e 05 - 2019
Algoritmo e Estrutura de dados em C - Aula 04 e 05 - 2019Algoritmo e Estrutura de dados em C - Aula 04 e 05 - 2019
Algoritmo e Estrutura de dados em C - Aula 04 e 05 - 2019
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentais
 
Pilhas e Filas
Pilhas e FilasPilhas e Filas
Pilhas e Filas
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQL
 
Aula 01
Aula 01Aula 01
Aula 01
 
Aula3
Aula3Aula3
Aula3
 
Aula 3-lógica.pptx
Aula 3-lógica.pptxAula 3-lógica.pptx
Aula 3-lógica.pptx
 
Python 04
Python 04Python 04
Python 04
 
Data warehouse & olap
Data warehouse & olapData warehouse & olap
Data warehouse & olap
 
Apresentação - Estruturas de Dados
Apresentação - Estruturas de DadosApresentação - Estruturas de Dados
Apresentação - Estruturas de Dados
 

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
 

Aula_05_-_Listas_Duplamente_Encadeadas.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 Encadeadas • São pilhas onde os elementos são encadeados; – não há estouro de pilha; – como o acesso de dados na pilha é puramente seqüencial, não há perda de eficiência. • Existem apenas duas operações: – Empilhar: equivale a adicionar no início. – Desempilhar: equivale a retirar do início. • É a forma como tradicionalmente pilhas são implementadas. 3 altura topo melão info próximo maçã info próximo uva info próximo Pilha Encadeada
  • 4. 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. 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
  • 9. 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
  • 10. 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: tipo tFila { tElemento *início; tElemento *fim; inteiro tamanho; };
  • 11. Algoritmo CriaFila tFila* FUNÇÃO criaFila() //Retorna ponteiro para uma nova cabeça de fila ou NULO. variáveis tFila *aFila; início aFila <- aloque(tFila); SE (aFila ~= NULO) ENTÃO //Só posso inicializar se consegui alocar. aFila->tamanho <- 0; aFila->início <- NULO; aFila->fim <- NULO; FIM SE RETORNE(aFila); fim;
  • 12. Algoritmo Adiciona (Fila) 2 melão info próximo maçã info próximo uva info próximo tam início fim
  • 13. Algoritmo Adiciona (Fila) 2 melão info próximo maçã info próximo uva info próximo tam início fim
  • 14. Algoritmo Adiciona (Fila) 3 melão info próximo maçã info próximo uva info próximo tam início fim
  • 15. Algoritmo Adiciona (Fila) Caso especial: Fila Vazia 0 tam início fim uva info próximo
  • 16. Algoritmo Adiciona (Fila) Caso especial: Fila Vazia 1 tam início fim uva info próximo
  • 17. Algoritmo Adiciona (Fila) Inteiro FUNÇÃO adiciona(tFila *aFila, TipoInfo *dado) variáveis tElemento *novo; //Variável auxiliar para o novo elemento. início novo <- aloque(tElemento); SE (novo = NULO) ENTÃO RETORNE(ERROFILACHEIA) SENÃO SE filaVazia(aFila) ENTÃO aFila->início <- novo SENÃO aFila->fim->próximo <- novo; FIM SE novo->próximo <- NULO; novo->info <- dado; aFila->fim <- novo; aFila->tamanho <- aFila->tamanho + 1; RETORNE(aFila->tamanho); FIM SE fim;
  • 18. Algoritmo Retira (Fila) 3 melão info próximo maçã info próximo uva info próximo tam início fim sai
  • 19. Algoritmo Retira (Fila) 3 melão info próximo maçã info próximo uva info próximo tam início fim sai
  • 20. Algoritmo Retira (Fila) 2 maçã info próximo uva info próximo tam início fim
  • 21. 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.
  • 22. Algoritmo Retira (Fila) Caso especial: Fila Unitária 0 tam início fim
  • 23. Algoritmo RetiraDoInício (Fila) TipoInfo* FUNÇÃO retiraDoInício(tFila *aFila) //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(aFila)) ENTÃO RETORNE(NULO) SENÃO saiu <- aFila->início; volta <- saiu->info; aFila->início <- saiu->próximo; //Se SAIU for o único, próximo é NULO e está certo. SE (aFila->tamanho = 1) ENTÃO //Fila unitária: devo anular o fim também. aFila->fim <- NULO; FIM SE aFila->tamanho <- aFila->tamanho - 1; LIBERE(saiu); RETORNE(volta); FIM SE fim;
  • 24. Exercício com Filas • Implemente o TAD Fila Encadeada com as suas duas operações de manipulação; • implemente um programa principal de aplicação que utilize uma fila para: – ler dados de pedidos de solicitação de conserto de computadores da marca HAL pela sua assistência técnica AssistHAL; – utilize o seguinte TipoInfo: nome do solicitante, telefone, data da entrega (inserida automaticamente), modelo do computador e valor do conserto, que é um valor chutado. • Após cadastrado um pedido, o sistema deverá informar quando o solicitante poderá contar com o computador pronto, sendo que: – a oficina AssistHAL leva em média duas semanas por pedido.
  • 25. 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.
  • 26. 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
  • 27. 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: tipo tListaDupla { tElementoDuplo *dados; inteiro tamanho; };
  • 28. 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: tipo tElementoDuplo { tElementoDuplo *anterior; tElementoDuplo *sucessor; TipoInfo *info; };
  • 29. 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
  • 30. Modelagem da Lista Duplamente Encadeada • Operações - colocar e retirar dados da lista: – AdicionaDuplo(listaDupla, dado) – AdicionaNoInícioDuplo(listaDupla, dado) – AdicionaNaPosiçãoDuplo(listaDupla, dado, posição) – AdicionaEmOrdemDuplo(listaDupla, dado) – RetiraDuplo(listaDupla) – RetiraDoInícioDuplo(listaDupla) – RetiraDaPosiçãoDuplo(listaDupla, posição) – RetiraEspecíficoDuplo(listaDupla, dado)
  • 31. Modelagem da Lista Duplamente Encadeada • Operações - testar a lista e outros testes: –ListaVaziaDuplo(listaDupla) –PosiçãoDuplo(listaDupla, dado) –ContémDuplo(listaDupla, dado) • Operações - inicializar ou limpar: –CriaListaDupla() –DestróiListaDupla(listaDupla)
  • 32. Algoritmo CriaListaDupla tListaDupla* FUNÇÃO criaListaDupla() //Retorna ponteiro para uma nova cabeça de lista ou NULO. variáveis tListaDupla *aLista; início aLista <- aloque(tListaDupla); SE (aLista ~= NULO) ENTÃO //Só posso inicializar se consegui alocar. aLista->tamanho <- 0; aLista->dados <- NULO; FIM SE RETORNE(aLista); fim;
  • 33. Algoritmo ListaVaziaDuplo Booleano FUNÇÃO listaVaziaDuplo(tListaDupla *aLista) início SE (aLista->tamanho = 0) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); fim;
  • 34. Algoritmo AdicionaNoInícioDuplo • Procedimento: – testamos se é possível alocar um elemento; – 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; – a ListaDupla.
  • 36. 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...
  • 38. Algoritmo AdicionaNoInícioDuplo Inteiro FUNÇÃO adicionaNoInícioDuplo(tListaDupla *aLista, TipoInfo *dado) variáveis tElementoDuplo *novo; //Variável auxiliar para o novo elemento. início novo <- aloque(tElementoDuplo); SE (novo = NULO) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO novo->suc <- aLista->dados; novo->ant <- NULO; novo->info <- dado; aLista->dados <- novo; SE (novo->suc ~= NULO) ENTÃO novo->suc->ant <- novo; FIM SE; aLista->tamanho <- aLista->tamanho + 1; RETORNE(1); FIM SE fim;
  • 39. 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. • Parâmetros: – a ListaDupla.
  • 44. Algoritmo RetiraDoInícioDuplo TipoInfo* FUNÇÃO retiraDoInícioDuplo(tListaDupla *aLista) //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(aLista)) ENTÃO RETORNE(NULO) SENÃO saiu <- aLista->dados; volta <- saiu->info; aLista->dados <- saiu->suc; SE (aLista->dados ~= NULO) ENTÃO aLista->dados->ant <- NULO; FIM SE aLista->tamanho <- aLista->tamanho - 1; LIBERE(saiu); RETORNE(volta); FIM SE fim;
  • 45. Algoritmo AdicionaNaPosiçãoDuplo • Praticamente idêntico à lista encadeada; • procedimento: – testamos se a posição existe e se é possível alocar elemento; – 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; – a Lista.
  • 46. Algoritmo AdicionaNaPosição Inteiro FUNÇÃO adicionaNaPosiçãoDuplo(tListaDupla *aLista, 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 > aLista->tamanho + 1 OU posição < 1) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO SE (posição = 1) ENTÃO RETORNE(adicionaNoInícioDuplo(aLista, info) SENÃO novo <- aloque(tElemento); SE (novo = NULO) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO anterior <- aLista->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; aLista->tamanho <- aLista->tamanho + 1; RETORNE(aLista->tamanho); FIM SE FIM SE FIM SE fim;
  • 47. 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; – a Lista.
  • 49. Algoritmo RetiraDaPosiçãoDuplo Posições > 1 4 maçã azeda cara uva irkh barata melão doce caro jaca irkh barata eliminar
  • 50. Algoritmo RetiraDaPosiçãoDuplo Posições > 1 3 maçã azeda cara uva irkh barata melão doce caro jaca irkh barata eliminar
  • 51. Algoritmo RetiraDaPosiçãoDuplo Posições > 1 3 maçã azeda cara melão doce caro jaca irkh barata
  • 52. Algoritmo RetiraDaPosiçãoDuplo TipoInfo* FUNÇÃO retiraDaPosiçãoDuplo(tListaDupla *aLista, 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 > aLista->tamanho OU posição < 1) ENTÃO RETORNE(NULO) SENÃO SE (posição = 1) ENTÃO RETORNE(retiraDoInícioDuplo(aLista)) SENÃO anterior <- aLista->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 aLista->tamanho <- aLista->tamanho - 1; LIBERE(eliminar); RETORNE(volta); FIM SE FIM SE fim;
  • 53. 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. – a ListaDupla.
  • 54. Algoritmo AdicionaEmOrdemDuplo Inteiro FUNÇÃO adicionaEmOrdemDuplo(tListaDupla *aLista, TipoInfo *dado) variáveis tElementoDuplo *atual; //Variável auxiliar para caminhar. inteiro posição; início SE (listaVaziaDupla(aLista)) ENTÃO RETORNE(adicionaNoInícioDuplo(aLista, dado)) SENÃO atual <- aLista->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(aLista,dado,posição + 1)) SENÃO RETORNE(adicionaNaPosiçãoDuplo(aLista, dado, posição)); FIM SE FIM SE fim;
  • 55. Algoritmos restantes Lista Duplamente Encadeada Por conta do aluno: • operações de inclusão e exclusão: –AdicionaDuplo(listaDupla, dado) –RetiraDuplo(listaDupla) –RetiraEspecíficoDuplo(listaDupla, dado) • Operações - inicializar ou limpar: –DestróiListaDupla(listaDupla)
  • 56. Exercício de Implementação 6 Implemente uma Lista de Rotas utilizando Listas Duplamente Encadeadas.
  • 57. 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.
  • 58. 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 um TAD separado com todas as suas funções.