590 likes | 758 Views
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.
E N D
Estruturas de Dados - T.332Capítulo 4 - IIListas Encadeadas4.2 Filas e Listas Duplamente Encadeadas4.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 • 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
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.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
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
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
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
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
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
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;
Algoritmo Adiciona (Fila) info próximo uva tam. inicio fim 2 info próximo info próximo melão maçã
Algoritmo Adiciona (Fila) info próximo uva tam. inicio fim 2 info próximo info próximo melão maçã
Algoritmo Adiciona (Fila) info próximo uva tam. inicio fim 3 info próximo info próximo melão maçã
Algoritmo Adiciona (Fila) Caso especial: Fila Vazia info próximo uva tam. inicio fim 0
Algoritmo Adiciona (Fila) Caso especial: Fila Vazia info próximo uva tam. inicio fim 1
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;
Algoritmo Retira (Fila) tam. inicio fim 3 sai info próximo info próximo melão maçã info próximo uva
Algoritmo Retira (Fila) sai info próximo uva tam. inicio fim 3 info próximo info próximo melão maçã
Algoritmo Retira (Fila) info próximo uva tam. inicio fim 2 info próximo maçã
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
Algoritmo Retira (Fila)Caso especial: Fila Unitária tam. inicio fim 0
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;
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.
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.
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
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; };
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; };
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.
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) • PosicaoDuplo(listaDupla, dado) • ContemDuplo(listaDupla, dado) • Operações: Inicializar ou limpar: • CriaListaDupla() • DestroiListaDupla(listaDupla)
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;
Algoritmo ListaVaziaDuplo Booleano FUNÇÃO listaVaziaDuplo(ListaDupla *aLista) início SE (aLista->tamanho = 0) ENTÃO RETORNE(Verdade) 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. • Parâmetros: • O tipo info (dado) a ser inserido. • ListaDupla.
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
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
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
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;
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.
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
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
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
Algoritmo RetiraDoInícioDuplo tam. dados 2 ant info suc ant info suc maçã uva azeda irkh cara barata
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;
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.
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;
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.
Algoritmo RetiraDaPosiçãoDuplo eliminar Posições > 1 4 melão maçã uva jaca doce azeda irkh irkh caro cara barata barata
Algoritmo RetiraDaPosição eliminar Posições > 1 4 melão maçã uva jaca doce azeda irkh irkh caro cara barata barata
Algoritmo RetiraDaPosição eliminar Posições > 1 3 melão maçã uva jaca doce azeda irkh irkh caro cara barata barata
Algoritmo RetiraDaPosição Posições > 1 3 melão maçã jaca doce azeda irkh caro cara barata