INE 5408 Estruturas de Dados Listas Encadeadas Pilhas

  • Slides: 75
Download presentation
INE 5408 Estruturas de Dados Listas Encadeadas - Pilhas encadeadas - Filas encadeadas -

INE 5408 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é

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 Pilha Encadeada altura topo 3 info próximo melão info próximo maçã info uva próximo

Pilhas 24 89 12 4 55 20 A Pilha é uma estrutura de dados

Pilhas 24 89 12 4 55 20 A Pilha é uma estrutura de dados cujo funcionamento é inspirado no de uma pilha “natural”.

Pilhas usando Vetores 24 89 12 4 55 20 -1 4 3 2 1

Pilhas usando Vetores 24 89 12 4 55 20 -1 4 3 2 1 0 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 nro dados 3 info melão Cabeça • A estruturas é limitada pela

Pilhas Encadeadas nro dados 3 info melão Cabeça • A estruturas é limitada pela De pilha memória disponível; • Não é necessário definir um próximo valor fixo para o tamanho da Pilha; info próximo maçã info Elemento de Pilha uva

Modelagem: Cabeça de Pilha • Necessitamos: – um ponteiro para o primeiro elemento da

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 t. Pilha { t. Elemento *dados; inteiro tamanho; };

Modelagem: Elemento de Pilha • Necessitamos: – um ponteiro para o próximo elemento da

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 t. Elemento { t. Elemento *próximo; tipo-que-eu-vou-usar-nesta-aplicação info; };

Modelagem: Elemento de Dados • Pseudo-código da Classe Tipo. Info: class Tipo. Info {

Modelagem: Elemento de Dados • Pseudo-código da Classe Tipo. Info: class Tipo. Info { tipo-do-campo 1; tipo-do-campo 2; … tipo-do-campo. N; } • Local: info. h

Modelagem da Pilha • Aspecto Funcional: – – colocar e retirar dados da pilha;

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: – Pilha. Vazia • Inicializar ou limpar: – cria. Pilha

Algoritmo cria. Pilha MÉTODO cria. Pilha() //Inicializa a cabeça e o tamanho da pilha

Algoritmo cria. Pilha MÉTODO cria. Pilha() //Inicializa a cabeça e o tamanho da pilha início dados <- NULO; tamanho <- 0; fim;

Algoritmo Pilha. Vazia Booleano MÉTODO pilha. Vazia() início SE (tamanho = 0) ENTÃO RETORNE(Verdadeiro)

Algoritmo Pilha. Vazia Booleano MÉTODO pilha. Vazia() início SE (tamanho = 0) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); fim; • Um algoritmo Pilha. Cheia 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

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 • Semelhanças? ?

Algoritmo Empilha = Adiciona. No. Início 2 novo melão maçã uva doce azeda irkh

Algoritmo Empilha = Adiciona. No. Início 2 novo melão maçã uva doce azeda irkh caro cara barata

Algoritmo Empilha 32 melão maçã uva doce azeda irkh caro cara barata

Algoritmo Empilha 32 melão maçã uva doce azeda irkh caro cara barata

Algoritmo Desempilha • Procedimento: – testamos se há elementos; – decrementamos o tamanho; –

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 • Semelhanças? ?

Algoritmo Desempilha = Retira. Do. Início 3 saiu volta melão maçã uva doce azeda

Algoritmo Desempilha = Retira. Do. Início 3 saiu volta melão maçã uva doce azeda irkh caro cara barata

Algoritmo Desempilha 3 saiu volta melão maçã uva doce azeda irkh caro cara barata

Algoritmo Desempilha 3 saiu volta melão maçã uva doce azeda irkh caro cara barata

Algoritmo Desempilha 2 saiu volta melão maçã uva doce azeda irkh caro cara barata

Algoritmo Desempilha 2 saiu volta melão maçã uva doce azeda irkh caro cara barata

Algoritmo Desempilha Tipo. Info* MÉTODO retira. Do. Início() //Elimina o primeiro elemento de uma

Algoritmo Desempilha Tipo. Info* MÉTODO retira. Do. Início() //Elimina o primeiro elemento de uma pilha. //Retorna a informação do elemento eliminado ou NULO. variáveis t. Elemento *saiu; //Variável auxiliar para o primeiro elemento. Tipo. Info *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

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

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

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

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

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

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; –

Filas: representação • Extensão da lista encadeada: – referenciamos o último elemento também; – adicionamos no fim; – excluímos do início. Fila tam início fim Pseudo-código: classe t. Fila { t. Elemento *início; t. Elemento *fim; inteiro tamanho; }; 3 info melão próximo info próximo maçã Elemento de Fila info uva próximo

Algoritmo Cria. Fila MÉTODO cria. Fila() //Inicializa a cabeça e o tamanho da fila

Algoritmo Cria. Fila MÉTODO cria. Fila() //Inicializa a cabeça e o tamanho da fila início inicio <- NULO; fim <- NULO; tamanho <- 0; RETORNE(a. Fila); fim;

Algoritmo Adiciona (Fila) tam início fim 2 info melão próximo info maçã próximo info

Algoritmo Adiciona (Fila) tam início fim 2 info melão próximo info maçã próximo info uva próximo

Algoritmo Adiciona (Fila) tam início fim 2 info melão próximo info maçã próximo info

Algoritmo Adiciona (Fila) tam início fim 2 info melão próximo info maçã próximo info uva próximo

Algoritmo Adiciona (Fila) tam início fim 3 info melão próximo info maçã próximo info

Algoritmo Adiciona (Fila) tam início fim 3 info melão próximo info maçã próximo info uva próximo

Algoritmo Adiciona (Fila) Caso especial: Fila Vazia tam início fim 0 info uva próximo

Algoritmo Adiciona (Fila) Caso especial: Fila Vazia tam início fim 0 info uva próximo

Algoritmo Adiciona (Fila) Caso especial: Fila Vazia tam início fim 1 info uva próximo

Algoritmo Adiciona (Fila) Caso especial: Fila Vazia tam início fim 1 info uva próximo

Algoritmo Adiciona (Fila) inteiro MÉTODO adiciona(Tipo. Info *dado) variáveis t. Elemento *novo; //Variável auxiliar

Algoritmo Adiciona (Fila) inteiro MÉTODO adiciona(Tipo. Info *dado) variáveis t. Elemento *novo; //Variável auxiliar para o novo elemento. início novo <- aloque(t. Elemento); SE fila. Vazia(a. Fila) 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) tam início fim 3 sai info melão próximo info maçã próximo

Algoritmo Retira (Fila) tam início fim 3 sai info melão próximo info maçã próximo info uva próximo

Algoritmo Retira (Fila) tam início fim 3 sai info melão próximo info maçã próximo

Algoritmo Retira (Fila) tam início fim 3 sai info melão próximo info maçã próximo info uva próximo

Algoritmo Retira (Fila) tam início fim 2 info maçã próximo info uva próximo

Algoritmo Retira (Fila) tam início fim 2 info maçã próximo info uva próximo

Algoritmo Retira (Fila) Caso especial: Fila Unitária tam início fim 1 info uva Não

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

Algoritmo Retira (Fila) Caso especial: Fila Unitária tam início fim 0

Algoritmo Retira (Fila) Caso especial: Fila Unitária tam início fim 0

Algoritmo Retira. Do. Início (Fila) Tipo. Info* MÉTODO retira. Do. Início() //Elimina o primeiro

Algoritmo Retira. Do. Início (Fila) Tipo. Info* MÉTODO retira. Do. Início() //Elimina o primeiro elemento de uma fila. //Retorna a informação do elemento eliminado ou NULO. variáveis t. Elemento *saiu; //Variável auxiliar para o primeiro elemento. Tipo. Info *volta; //Variável auxiliar para o dado retornado. início SE (fila. Vazia()) 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

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 tam dados 3 ant info suc melão maçã uva

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

Modelagem: Cabeça de Lista. Dupla • Necessitamos: – um ponteiro para o primeiro elemento

Modelagem: Cabeça de Lista. Dupla • Necessitamos: – um ponteiro para o primeiro elemento da lista; – um inteiro para indicar quantos elementos a lista possui. • Pseudo-código: classe t. Lista. Dupla { t. Elemento. Duplo *dados; inteiro tamanho; };

Modelagem: Elemento de Lista. Dupla • Necessitamos: – um ponteiro para o elemento anterior

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: classe t. Elemento. Duplo { t. Elemento. Duplo *anterior; t. Elemento. Duplo *sucessor; Tipo. Info *info; };

Modelagem da Lista Duplamente Encadeada • Aspecto Funcional: – colocar e retirar dados da

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. tam dados 3 ant info suc melão maçã uva doce azeda irkh caro cara barata

Modelagem da Lista Duplamente Encadeada • Operações - colocar e retirar dados da lista:

Modelagem da Lista Duplamente Encadeada • Operações - colocar e retirar dados da lista: – Adiciona. Duplo(dado) – Adiciona. No. Início. Duplo(dado) – Adiciona. Na. Posição. Duplo(dado, posição) – Adiciona. Em. Ordem. Duplo(dado) – Retira. Duplo() – Retira. Do. Início. Duplo() – Retira. Da. Posição. Duplo(posição) – Retira. Específico. Duplo(dado)

Modelagem da Lista Duplamente Encadeada • Operações - testar a lista e outros testes:

Modelagem da Lista Duplamente Encadeada • Operações - testar a lista e outros testes: – Lista. Vazia. Duplo() – Posição. Duplo(dado) – Contém. Duplo(dado) • Operações - inicializar ou limpar: – Cria. Lista. Dupla() – Destrói. Lista. Dupla()

Algoritmo Cria. Lista. Dupla MÉtodo cria. Lista. Dupla() //Inicializa as variávels anterior <- NULO;

Algoritmo Cria. Lista. Dupla MÉtodo cria. Lista. Dupla() //Inicializa as variávels anterior <- NULO; sucessor <- NULO; tamanho <- 0; fim;

Algoritmo Lista. Vazia. Duplo Booleano Método lista. Vazia. Duplo() início SE (tamanho = 0)

Algoritmo Lista. Vazia. Duplo Booleano Método lista. Vazia. Duplo() início SE (tamanho = 0) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); fim;

Algoritmo Adiciona. No. Início. Duplo • Procedimento: – fazemos o sucessor deste novo elemento

Algoritmo Adiciona. No. Início. Duplo • 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 Adiciona. No. Início. Duplo tam dados 2 novo ant info suc melão maçã

Algoritmo Adiciona. No. Início. Duplo tam dados 2 novo ant info suc melão maçã uva doce azeda irkh caro cara barata

Algoritmo Adiciona. No. Início. Duplo Caso novo->suc não seja nulo. . . tam Faço

Algoritmo Adiciona. No. Início. Duplo Caso novo->suc não seja nulo. . . tam Faço novo->suc->ant ser novo. . . dados 2 novo ant info suc melão maçã uva doce azeda irkh caro cara barata

Algoritmo Adiciona. No. Início. Duplo tam dados 3 novo ant info suc melão maçã

Algoritmo Adiciona. No. Início. Duplo tam dados 3 novo ant info suc melão maçã uva doce azeda irkh caro cara barata

Algoritmo Adiciona. No. Início. Duplo Inteiro MÉTODO adiciona. No. Início. Duplo(Tipo. Info *dado) variáveis

Algoritmo Adiciona. No. Início. Duplo Inteiro MÉTODO adiciona. No. Início. Duplo(Tipo. Info *dado) variáveis t. Elemento. Duplo *novo; //Variável auxiliar para o novo elemento. início novo <- aloque(t. Elemento. Duplo); 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 Retira. Do. Início. Duplo • Procedimento: – testamos se há elementos; – decrementamos

Algoritmo Retira. Do. Início. Duplo • 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 Retira. Do. Início. Duplo tam dados 3 ant info suc saiu volta ant

Algoritmo Retira. Do. Início. Duplo tam dados 3 ant info suc saiu volta ant info suc melão maçã uva doce azeda irkh caro cara barata

Algoritmo Retira. Do. Início. Duplo tam dados 2 ant info suc saiu volta ant

Algoritmo Retira. Do. Início. Duplo tam dados 2 ant info suc saiu volta ant info suc melão maçã uva doce azeda irkh caro cara barata

Algoritmo Retira. Do. Início. Duplo tam dados 2 ant info suc saiu volta ant

Algoritmo Retira. Do. Início. Duplo tam dados 2 ant info suc saiu volta ant info suc melão maçã uva doce azeda irkh caro cara barata

Algoritmo Retira. Do. Início. Duplo tam dados 2 ant info suc maçã uva azeda

Algoritmo Retira. Do. Início. Duplo tam dados 2 ant info suc maçã uva azeda irkh cara barata

Algoritmo Retira. Do. Início. Duplo Tipo. Info* MÉTODO retira. Do. Início. Duplo() //Elimina o

Algoritmo Retira. Do. Início. Duplo Tipo. Info* MÉTODO retira. Do. Início. Duplo() //Elimina o primeiro elemento de uma lista duplamente encadeada. //Retorna a informação do elemento eliminado ou NULO. variáveis t. Elemento. Duplo *saiu; //Variável auxiliar para o primeiro elemento. Tipo. Info *volta; //Variável auxiliar para o dado retornado. início SE (lista. Vazia. Duplo()) 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 Adiciona. Na. Posição. Duplo • Praticamente idêntico à lista encadeada; • procedimento: –

Algoritmo Adiciona. Na. Posição. Duplo • 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 Adiciona. Na. Posição Inteiro MÉTODO adiciona. Na. Posição. Duplo(Tipo. Info *info, inteiro posição)

Algoritmo Adiciona. Na. Posição Inteiro MÉTODO adiciona. Na. Posição. Duplo(Tipo. Info *info, inteiro posição) //Adiciona novo elemento na posição informada. //Retorna o novo número de elementos da lista ou erro. variáveis t. Elemento. Duplo *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(adiciona. No. Início. Duplo(info) SENÃO novo <- aloque(t. Elemento); 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;

Algoritmo Retira. Da. Posição. Duplo • Mais simples que na Lista Encadeada; • procedimento:

Algoritmo Retira. Da. Posição. Duplo • 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 Retira. Da. Posição. Duplo Posições > 1 eliminar 4 melão maçã uva jaca

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

Algoritmo Retira. Da. Posição. Duplo Posições > 1 eliminar 4 melão maçã uva jaca

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

Algoritmo Retira. Da. Posição. Duplo Posições > 1 eliminar 3 melão maçã uva jaca

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

Algoritmo Retira. Da. Posição. Duplo Posições > 1 3 melão maçã jaca doce azeda

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

Algoritmo Retira. Da. Posição. Duplo Tipo. Info* MÉTODO retira. Da. Posição. Duplo(inteiro posição) //Elimina

Algoritmo Retira. Da. Posição. Duplo Tipo. Info* MÉTODO retira. Da. Posição. Duplo(inteiro posição) //Elimina o elemento da posição informada. //Retorna a informação do elemento eliminado ou NULO. variáveis t. Elemento. Duplo *anterior, *eliminar; //Variável auxiliar para elemento. Tipo. Info *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(retira. Do. Início. Duplo()) 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;

Algoritmo Adiciona. Em. Ordem. Duplo • Idêntico à lista encadeada; • procedimento: – necessitamos

Algoritmo Adiciona. Em. Ordem. Duplo • Idêntico à lista encadeada; • procedimento: – necessitamos de uma função para comparar os dados (maior); – procuramos pela posição onde inserir comparando dados; – chamamos adiciona. Na. Posição. Duplo(). • Parâmetros: – o dado a ser inserido.

Algoritmo Adiciona. Em. Ordem. Duplo Inteiro Método adiciona. Em. Ordem. Duplo(Tipo. Info *dado) variáveis

Algoritmo Adiciona. Em. Ordem. Duplo Inteiro Método adiciona. Em. Ordem. Duplo(Tipo. Info *dado) variáveis t. Elemento. Duplo *atual; //Variável auxiliar para caminhar. inteiro posição; início SE (lista. Vazia. Dupla()) ENTÃO RETORNE(adiciona. No. Início. Duplo( 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(adiciona. Na. Posição. Duplo(dado, posição + 1)) SENÃO RETORNE(adiciona. Na. Posição. Duplo(dado, posição)); FIM SE fim;

Algoritmos restantes Lista Duplamente Encadeada Por conta do aluno: • operações de inclusão e

Algoritmos restantes Lista Duplamente Encadeada Por conta do aluno: • operações de inclusão e exclusão: – Adiciona. Duplo(dado) – Retira. Duplo() – Retira. Específico. Duplo(dado) • Operações - inicializar ou limpar: – Destrói. Lista. Dupla()

Exercício de Implementação 6 Implemente uma Lista de Rotas utilizando Listas Duplamente Encadeadas.

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

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

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.