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.

Aula_05_-_Listas_Duplamente_Encadeadas_opp.ppt

  • 1.
    INE5408 Estruturas de Dados ListasEncadeadas - Pilhas encadeadas - Filas encadeadas - Listas duplamente encadeadas
  • 2.
    Extensões do conceitode 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 • Aestruturas é 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 dePilha • 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 dePilha • 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 deDados • 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() //Inicializaa cabeça e o tamanho da pilha início dados <- NULO; tamanho <- 0; fim;
  • 11.
    Algoritmo PilhaVazia Booleano MÉTODOpilhaVazia() 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;
  • 13.
  • 14.
  • 15.
  • 16.
    Algoritmo Desempilha • Procedimento: –testamosse há elementos; –decrementamos o tamanho; –liberamos a memória do elemento; –devolvemos a informação.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
    Algoritmo Desempilha TipoInfo* MÉTODOretiraDoIní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 • É umaestrutura 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 • É umaestrutura 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 • É umaestrutura 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 • É umaestrutura 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 • É umaestrutura 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ãoda 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() //Inicializaa 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 infopróximo maçã info próximo uva info próximo tam início fim
  • 31.
    Algoritmo Adiciona (Fila) 2 melão infopróximo maçã info próximo uva info próximo tam início fim
  • 32.
    Algoritmo Adiciona (Fila) 3 melão infopróximo maçã info próximo uva info próximo tam início fim
  • 33.
    Algoritmo Adiciona (Fila) Casoespecial: Fila Vazia 0 tam início fim uva info próximo
  • 34.
    Algoritmo Adiciona (Fila) Casoespecial: Fila Vazia 1 tam início fim uva info próximo
  • 35.
    Algoritmo Adiciona (Fila) inteiroMÉ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 infopróximo maçã info próximo uva info próximo tam início fim sai
  • 37.
    Algoritmo Retira (Fila) 3 melão infopróximo maçã info próximo uva info próximo tam início fim sai
  • 38.
    Algoritmo Retira (Fila) 2 maçã infopróximo uva info próximo tam início fim
  • 39.
    Algoritmo Retira (Fila) Casoespecial: 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) Casoespecial: 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 deListaDupla • 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 deListaDupla • 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 ListaDuplamente 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 ListaDuplamente 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 ListaDuplamente 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() //Inicializaas variávels anterior <- NULO; sucessor <- NULO; tamanho <- 0; fim;
  • 50.
    Algoritmo ListaVaziaDuplo Booleano MétodolistaVaziaDuplo() 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;
  • 52.
  • 53.
    Algoritmo AdicionaNoInícioDuplo novo 2 tam dados maçã azeda cara uva irkh barata melão doce caro antinfo suc ant info suc ant info suc Caso novo->suc não seja nulo... Faço novo->suc->ant ser novo...
  • 54.
  • 55.
    Algoritmo AdicionaNoInícioDuplo Inteiro MÉTODOadicionaNoIní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.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
    Algoritmo RetiraDoInícioDuplo TipoInfo* MÉTODOretiraDoIní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 • Praticamenteidê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ÉTODOadicionaNaPosiçã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 • Maissimples 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;
  • 65.
  • 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ÉTODOretiraDaPosiçã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étodoadicionaEmOrdemDuplo(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 DuplamenteEncadeada 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ção6 Implemente uma Lista de Rotas utilizando Listas Duplamente Encadeadas.
  • 74.
    Exercício de Implementação6 • 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ção6 • 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.