A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

INE5408 Estruturas de Dados Listas Encadeadas - Pilhas encadeadas - Filas encadeadas - Listas duplamente encadeadas.

Apresentações semelhantes


Apresentação em tema: "INE5408 Estruturas de Dados Listas Encadeadas - Pilhas encadeadas - Filas encadeadas - Listas duplamente encadeadas."— Transcrição da apresentação:

1

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.


Carregar ppt "INE5408 Estruturas de Dados Listas Encadeadas - Pilhas encadeadas - Filas encadeadas - Listas duplamente encadeadas."

Apresentações semelhantes


Anúncios Google