Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouDina Casqueira Gomes Alterado mais de 7 anos atrás
2
INE5408 Estruturas de Dados Listas Encadeadas - Pilhas encadeadas - Filas encadeadas - Listas duplamente encadeadas
3
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 alturatopo melão infopróximo maçã infopróximo uva infopróximo Pilha Encadeada
4
Pilhas 20 55 4 12 89 24 A Pilha é uma estrutura de dados cujo funcionamento é inspirado no de uma pilha “natural”.
5
Pilhas usando Vetores 20 55 4 12 89 01234 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;
6
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 nrodados Cabeça De pilha Elemento de Pilha
7
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; };
8
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; };
9
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
10
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
11
Algoritmo criaPilha MÉTODO criaPilha() //Inicializa a cabeça e o tamanho da pilha início dados <- NULO; tamanho <- 0; fim;
12
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.
13
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;
14
Algoritmo Empilha Semelhanças????
15
Algoritmo Empilha = AdicionaNoInício 2 maçã azeda cara uva irkh barata melão doce caro novo
16
Algoritmo Empilha 2 maçã azeda cara uva irkh barata melão doce caro 3
17
Algoritmo Desempilha Procedimento: –testamos se há elementos; –decrementamos o tamanho; –liberamos a memória do elemento; –devolvemos a informação.
18
Algoritmo Desempilha Semelhanças??
19
Algoritmo Desempilha = RetiraDoInício 3 maçã azeda cara uva irkh barata melão doce caro saiu volta
20
Algoritmo Desempilha 3 maçã azeda cara uva irkh barata melão doce caro saiu volta
21
Algoritmo Desempilha 2 maçã azeda cara uva irkh barata melão doce caro saiu volta
22
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 info; dados próximo; tamanho <- tamanho - 1; LIBERE(saiu); RETORNE(volta); FIM SE fim;
23
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
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 É 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
29
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 infopróximo maçã infopróximo uva infopróximo taminício fim Fila Elemento de Fila Pseudo-código: classe tFila { tElemento *início; tElemento *fim; inteiro tamanho; };
30
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;
31
Algoritmo Adiciona (Fila) 2 melão infopróximo maçã infopróximo uva infopróximo taminício fim
32
Algoritmo Adiciona (Fila) 2 melão infopróximo maçã infopróximo uva infopróximo taminício fim
33
Algoritmo Adiciona (Fila) 3 melão infopróximo maçã infopróximo uva infopróximo taminício fim
34
Algoritmo Adiciona (Fila) Caso especial: Fila Vazia 0 taminício fim uva infopróximo
35
Algoritmo Adiciona (Fila) Caso especial: Fila Vazia 1 taminício fim uva infopróximo
36
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;
37
Algoritmo Retira (Fila) 3 melão infopróximo maçã infopróximo uva infopróximo taminício fim sai
38
Algoritmo Retira (Fila) 3 melão infopróximo maçã infopróximo uva infopróximo taminício fim sai
39
Algoritmo Retira (Fila) 2 maçã infopróximo uva infopróximo taminício fim
40
Algoritmo Retira (Fila) Caso especial: Fila Unitária 1 uva infopróximo taminício fim Não preciso de uma variável auxiliar sai.
41
Algoritmo Retira (Fila) Caso especial: Fila Unitária 0 taminício fim
42
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 info; início 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;
43
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.
44
Listas Duplamente Encadeadas - Modelagem 3 tamdados melão doce caro maçã azeda cara uva irkh barata antinfo sucantinfo sucantinfo suc
45
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; };
46
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; };
47
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 tamdados melão doce caro maçã azeda cara uva irkh barata ant info suc ant info suc ant info suc
48
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)
49
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()
50
Algoritmo CriaListaDupla MÉtodo criaListaDupla() //Inicializa as variávels anterior <- NULO; sucessor <- NULO; tamanho <- 0; fim;
51
Algoritmo ListaVaziaDuplo Booleano Método listaVaziaDuplo() início SE (tamanho = 0) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); fim;
52
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 tamdados maçã azeda cara uva irkh barata melão doce caro antinfo sucantinfo sucantinfo suc
54
Algoritmo AdicionaNoInícioDuplo novo 2 tamdados maçã azeda cara uva irkh barata melão doce caro antinfo sucantinfo sucantinfo suc Caso novo->suc não seja nulo... Faço novo->suc->ant ser novo...
55
Algoritmo AdicionaNoInícioDuplo novo 3 tamdados maçã azeda cara uva irkh barata melão doce caro antinfo sucantinfo sucantinfo suc
56
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;
57
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.
58
Algoritmo RetiraDoInícioDuplo saiu volta 3 tamdados maçã azeda cara uva irkh barata melão doce caro antinfo sucantinfo sucantinfo suc
59
Algoritmo RetiraDoInícioDuplo saiu volta 2 tamdados maçã azeda cara uva irkh barata melão doce caro antinfo sucantinfo sucantinfo suc
60
Algoritmo RetiraDoInícioDuplo saiu volta 2 tamdados maçã azeda cara uva irkh barata melão doce caro antinfo sucantinfo sucantinfo suc
61
Algoritmo RetiraDoInícioDuplo 2 tamdados maçã azeda cara uva irkh barata antinfo sucantinfo suc
62
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 info; dados suc; SE (dados ~= NULO) ENTÃO dados->ant <- NULO; FIM SE tamanho <- tamanho - 1; LIBERE(saiu); RETORNE(volta); FIM SE fim;
63
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;
64
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 suc; novo->suc 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;
65
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 4 maçã azeda cara uva irkh barata melão doce caro jaca irkh barata eliminar Posições > 1
67
Algoritmo RetiraDaPosiçãoDuplo Posições > 1 4 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 uva irkh barata melão doce caro jaca irkh barata eliminar
69
Algoritmo RetiraDaPosiçãoDuplo Posições > 1 3 maçã azeda cara melão doce caro jaca irkh barata
70
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 suc; eliminar suc; volta info; anterior->suc suc; SE eliminar->suc ~= NULO ENTÃO eliminar->suc->ant <- anterior; FIM SE tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta); FIM SE fim;
71
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.
72
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 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;
73
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()
74
Exercício de Implementação 6 Implemente uma Lista de Rotas utilizando Listas Duplamente Encadeadas.
75
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.
76
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.
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.