1 / 57

Estruturas de Dados - T.332 Capítulo 4 - II Listas Encadeadas 4.2 Filas e Listas Duplamente Encadeadas 4.3 Listas Circu

Estruturas de Dados - T.332 Capítulo 4 - II Listas Encadeadas 4.2 Filas e Listas Duplamente Encadeadas 4.3 Listas Circulares. 4.2 Extensões do Conceito de Lista Encadeada. Pilha Encadeada. altura. topo. 3. info. próximo. melão. info. próximo. maçã. info. próximo. uva.

temima
Download Presentation

Estruturas de Dados - T.332 Capítulo 4 - II Listas Encadeadas 4.2 Filas e Listas Duplamente Encadeadas 4.3 Listas Circu

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Estruturas de Dados - T.332Capítulo 4 - IIListas Encadeadas4.2 Filas e Listas Duplamente Encadeadas4.3 Listas Circulares

  2. 4.2 Extensões do Conceito de Lista Encadeada Pilha Encadeada altura topo 3 info próximo melão info próximo maçã info próximo uva • A idéia da Lista Encadeada como foi 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. 4.2.1 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. • Somente duas operações existem: • Empilhar: equivale a adicionar no início • Desempilhar: equivale a retirar do início. • É a forma como tradicionalmente pilhas são implementadas. Pilha Encadeada altura topo 3 info próximo melão info próximo maçã info próximo uva

  4. 4.2.2 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. 4.2.2 Filas • É uma estrutura de dados improtantí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. 4.2.2 Filas • É uma estrutura de dados improtantí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. 4.2.2 Filas • É uma estrutura de dados improtantí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. 4.2.2 Filas • É uma estrutura de dados improtantí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. 4.2.2 Filas: Representação Fila Elemento de Fila Pseudo-código: tipo Fila { Elemento *inicio; Elemento *fim; inteiro tamanho; }; • Extensão da lista encadeada • Referenciamos o último elemento também. • Adicionamos no fim • Excluímos do início tam. inicio fim 3 info próximo info próximo info próximo melão maçã uva

  10. Algoritmo CriaFila Fila* FUNÇÃO criaFila() “Retorna ponteiro para uma nova cabeça de fila ou NULO“ variáveis Fila *aFila; início aFila <- aloque(Fila ); SE (aFila ~= NULO) ENTÃO “So posso inicializar se consegui alocar” aFila->tamanho <- 0; aFila->início <- nulo; aFila->fim <- nulo; FIM SE RETORNE(aFila); fim;

  11. Algoritmo Adiciona (Fila) info próximo uva tam. inicio fim 2 info próximo info próximo melão maçã

  12. Algoritmo Adiciona (Fila) info próximo uva tam. inicio fim 2 info próximo info próximo melão maçã

  13. Algoritmo Adiciona (Fila) info próximo uva tam. inicio fim 3 info próximo info próximo melão maçã

  14. Algoritmo Adiciona (Fila) Caso especial: Fila Vazia info próximo uva tam. inicio fim 0

  15. Algoritmo Adiciona (Fila) Caso especial: Fila Vazia info próximo uva tam. inicio fim 1

  16. Algoritmo Adiciona (Fila) Inteiro FUNÇÃO adiciona ( Fila *aFila, TipoInfo *dado ) variáveis Elemento *novo; “Var. auxiliar para o novo elemento” início novo <- aloque(Elemento); SE (novo = NULO) ENTÃO RETORNE( ErroListaCheia ); SENÃO SE filaVazia(aFila) ENTÃO aFila->inicio <- novo; SENÃO aFila->fim->proximo <- novo; FIM SE novo->proximo <- NULO; novo->info <- dado; aFila->fim <- novo; aFila->tamanho <- aFila->tamanho + 1; RETORNE(aFila->tamanho); FIM SE fim;

  17. Algoritmo Retira (Fila) tam. inicio fim 3 sai info próximo info próximo melão maçã info próximo uva

  18. Algoritmo Retira (Fila) sai info próximo uva tam. inicio fim 3 info próximo info próximo melão maçã

  19. Algoritmo Retira (Fila) info próximo uva tam. inicio fim 2 info próximo maçã

  20. Algoritmo Retira (Fila)Caso especial: Fila Unitária info próximo uva tam. inicio fim 1 Não preciso de uma variável auxiliar sai

  21. Algoritmo Retira (Fila)Caso especial: Fila Unitária tam. inicio fim 0

  22. Algoritmo Retira (Fila) TipoInfo* FUNÇÃO retiraDoInício( Fila *aFila ) “Elimina o 1. Elemento de uma fila. Retorna a informação do elemento eliminado ou NULO.” variáveis Elemento *saiu; “Var. auxiliar para o 1. elemento” TipoInfo *volta; “Var. 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->proximo; “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;

  23. 4.2.2.1 Exercício com Filas • Implemente o TAD Fila 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 assistencia 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.

  24. 4.2.3 Listas Duplamente Encadeadas • A Lista Encadeada e a Fila possuem a desvantagem de somente podermos caminhar em uma direção. • Vimos que para olhar um elemento que “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 e frente e trás.

  25. 4.2.3 Listas Duplamente Encadeadas: Modelagem tam. dados 3 ant info suc ant info suc ant info suc melão maçã uva doce azeda irkh caro cara barata

  26. 4.2.3 Modelagem: Cabeça de ListaDupla • Necessitamos: • Um ponteiro para o primeiro elemento da lista. • Um inteiro para indicar quantos elementos a lista possue. • Pseudo-código: tipo ListaDupla { ElementoDuplo *dados; inteiro tamanho; };

  27. 4.2.3 Modelagem: Elemento de Lista Dupla • 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 ElementoDuplo { ElementoDuplo *anterior; ElementoDuplo *sucessor; TipoInfo *info; };

  28. 4.2.4 Modelagem da Lista Duplamente Encadeada tam. dados 3 ant ant ant info suc info suc info suc melão maçã uva doce azeda irkh caro cara barata • Aspecto Funcional: • Colocar e retirar dados da lista. • Testar se a lista está vazia e outros testes. • Inicializa-la e garantir a ordem dos elementos.

  29. 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)

  30. Modelagem da Lista Duplamente Encadeada • Operações: Testar a lista e outros testes: • ListaVaziaDuplo(listaDupla) • PosicaoDuplo(listaDupla, dado) • ContemDuplo(listaDupla, dado) • Operações: Inicializar ou limpar: • CriaListaDupla() • DestroiListaDupla(listaDupla)

  31. Algoritmo CriaListaDupla ListaDupla* FUNÇÃO criaListaDupla() “Retorna ponteiro para uma nova cabeça de lista ou NULO“ variáveis ListaDupla *aLista; início aLista <- aloque(ListaDupla); SE (aLista ~= NULO) ENTÃO “So posso inicializar se consegui alocar” aLista->tamanho <- 0; aLista->dados <- nulo; FIM SE RETORNE(aLista); fim;

  32. Algoritmo ListaVaziaDuplo Booleano FUNÇÃO listaVaziaDuplo(ListaDupla *aLista) início SE (aLista->tamanho = 0) ENTÃO RETORNE(Verdade) SENÃO RETORNE(Falso); fim;

  33. 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. • Parâmetros: • O tipo info (dado) a ser inserido. • ListaDupla.

  34. Algoritmo AdicionaNoInícioDuplo ant info suc novo melão doce caro tam. dados 2 ant info suc ant info suc maçã uva azeda irkh cara barata

  35. Algoritmo AdicionaNoInícioDuplo ant info suc novo melão doce caro Caso novo->suc não seja nulo... tam. dados Faço novo->suc->ant ser novo... 2 ant info suc ant info suc maçã uva azeda irkh cara barata

  36. Algoritmo AdicionaNoInícioDuplo ant info suc novo melão doce caro tam. dados 3 ant info suc ant info suc maçã uva azeda irkh cara barata

  37. Algoritmo AdicionaNoInícioDuplo Inteiro FUNÇÃO adicionaNoInícioDuplo( ListaDupla *aLista, TipoInfo *dado ) variáveis ElementoDuplo *novo; “Var. auxiliar para o novo elemento” início novo <- aloque(ElementoDuplo); 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;

  38. 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: • ListaDupla.

  39. Algoritmo RetiraDoInícioDuplo ant info suc saiu volta melão doce caro tam. dados 3 ant info suc ant info suc maçã uva azeda irkh cara barata

  40. Algoritmo RetiraDoInícioDuplo ant info suc saiu volta melão doce caro tam. dados 2 ant info suc ant info suc maçã uva azeda irkh cara barata

  41. Algoritmo RetiraDoInícioDuplo ant info suc saiu volta melão doce caro tam. dados 2 ant info suc ant info suc maçã uva azeda irkh cara barata

  42. Algoritmo RetiraDoInícioDuplo tam. dados 2 ant info suc ant info suc maçã uva azeda irkh cara barata

  43. Algoritmo RetiraDoInícioDuplo TipoInfo* FUNÇÃO retiraDoInício( ListaDupla *aLista ) “Elimina o 1. Elemento de uma lista duplamente encadeada. Retorna a informação do elemento eliminado ou NULO.” variáveis ElementoDuplo *saiu; “Var. auxiliar para o 1. elemento” TipoInfo *volta; “Var. 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;

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

  45. Algoritmo AdicionaNaPosição Inteiro FUNÇÃO adicionaNaPosiçãoDuplo( ListaDupla *aLista, TipoInfo *info, inteiro posição ) “Adiciona novo elemento na posição dada. Retorna a novo numero de elementos da lista ou erro.” variáveis ElementoDuplo *novo, *anterior; “Ponteiros auxiliares” início SE (posição > aLista->tamanho + 1) ENTÃO RETORNE( ErroPosição ) SENÃO SE (posição = 1) ENTÃO RETORNE(adicionaNoInícioDuplo(aLista, info); SENÃO novo <- aloque(Elemento); 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;

  46. Algoritmo RetiraDaPosiçãoDuplo • Mais simples que a 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. • Lista.

  47. Algoritmo RetiraDaPosiçãoDuplo eliminar Posições > 1 4 melão maçã uva jaca doce azeda irkh irkh caro cara barata barata

  48. Algoritmo RetiraDaPosição eliminar Posições > 1 4 melão maçã uva jaca doce azeda irkh irkh caro cara barata barata

  49. Algoritmo RetiraDaPosição eliminar Posições > 1 3 melão maçã uva jaca doce azeda irkh irkh caro cara barata barata

  50. Algoritmo RetiraDaPosição Posições > 1 3 melão maçã jaca doce azeda irkh caro cara barata

More Related