Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
LISTA LINEAR (parte I) Estrutura de Dados Uma Lista Linear (LL) é uma seqüência de nodos Lista linear Nodos - elementos do mesmo tipo Relação de ordem linear (ou total) Lista linear a b c d e Primeiro nodo Último nodo Segundo nodo Estrutura interna é abstraída Pode ter uma complexidade arbitrária Enfatizado o conjunto de relações existente z d a c b d Estrutura dos nodos Uma lista linear é uma coleção de n 0 nodos x1, x2, ... , xn, todos do mesmo tipo, cujas propriedades estruturais relevantes envolvem apenas as posições relativas lineares entre nodos: n = 0 : lista vazia, apresenta zero nodos n > 0 : x1 é o primeiro nodo xn é o último nodo 1 < k < n : xk é precedido por xk-1 e sucedido por xk+1 Lista linear: seqüência de 0 ou mais nodos do mesmo tipo Definição formal Notas de alunos Cadastro de funcionários de uma empresa Itens em estoque em uma empresa Dias da semana Vagões de um trem Letras de uma palavra Pessoas esperando ônibus Cartas de baralho Precipitações pluviométricas em um mês / dia Exemplos de aplicações com listas Operações sobre listas lineares Criação de uma lista Inserção de um nodo Exclusão de um nodo Acesso a um nodo Destruição de uma lista Operações básicas: Contigüidade física Encadeamento Representação física das relações existentes entre os nodos e não aquelas internas a eles Representação física de uma lista linear Listas lineares LL implementadas através de contiguidade física Implementação de LL através de contigüidade física Utiliza a seqüencialidade da memória para representar a ordem entre os nodos Lista linear Arranjo Implementação de LL sobre arranjo de 1 dimensão Características todos os elementos do arranjo tem tipo igual cada elemento do arranjo é um nodo tipo do nodo = tipo do elemento do arranjo posição no arranjo representa posição na LL acesso direto aos nodos natureza dinâmica – inserção / remoção de nodos comprimento varia durante aplicação LL – contiguidade física L2 L1 L3 L4 L5 L6 L1 L2 L3 L4 L5 L6 1 2 3 4 5 6 L L TipoNodo = registro Nome: string Código: inteiro Valor: real fim registro TipoLista = arranjo [1 .. N] de TipoNodo Tipos de dados Tipos de dados utilizados nos algoritmos para LL implementada com contiguidade física: LL – contiguidade física 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 Lista LL – contiguidade física Início e final da LL geralmente são diferentes do início e final do arranjo Início e final da LL Variáveis para identificar Início e Final da Lista 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 Início do Arranjo Final do Arranjo Lista LL – contiguidade física Início e final da LL geralmente são diferentes do início e final do arranjo Início e final da LL Variáveis para identificar Início e Final da Lista Um mesmo arranjo pode ser utilizado para mais de uma lista linear Mais de uma LL em um arranjo 1 2 4 3 7 6 9 10 LL IL1 FL2 IA FA L1 L2 L1 L2 L3 5 8 IL2 FL1 Lista 1 Lista 2 LL – contiguidade física criação da lista inserção de um novo nodo remoção de um nodo acesso a um nodo Operações sobre listas lineares em contiguidade física Algoritmos LL – contiguidade física 1 2 4 3 7 6 9 10 LL 5 8 Criação de uma LL vazia Declarar o arranjo Inicializar variáveis que guardam início e final da lista IL = FL = IA-1 IA FA LL – contiguidade física Algoritmo: Inicializar LL sobre Arranjo vazio LL – contiguidade física Algoritmo InicializarLLArr Entradas: IA (inteiro) Saídas: IL, FL (inteiro) início IL FL IA - 1 fim Ex: Lista de informações de produtos de uma empresa TipoNodo = registro Nome: string Código: inteiro Preço: real fim registro TipoLista = arranjo [1 .. 10] de TipoNodo 1 2 4 3 7 6 9 10 LL 5 8 IA FA Nome Código Preço IL FL 0 Inserção de um novo nodo LL – contiguidade física LL já existente Informar: posição (ordem) do novo nodo na LL valor do campo de informação do novo nodo Quando não é possível realizar a inserção: posição solicitada fora dos limites da LL existente espaço disponível para a LL no arranjo todo preenchido L1 L2 L3 L4 L5 L6 0 1 2 3 4 5 6 7 L L IA IL FL FA Inserção de um novo nodo LL – contiguidade física LL – contiguidade física Inserção como primeiro nodo da LL 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 Inserir no início LL inicia no início do arranjo LL – contiguidade física Inserção como primeiro nodo da LL 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 1 2 4 3 7 6 9 10 LL 5 8 IA FA Inserir no início LL inicia no início do arranjo LL – contiguidade física Inserção como primeiro nodo da LL 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 1 2 4 3 7 6 9 10 LL L1 L2 L3 L4 L5 L6 L7 5 8 IL FL IA FA Inserir no início Novo nodo LL inicia no início do arranjo LL – contiguidade física Inserção como primeiro nodo da LL LL não inicia no início do arranjo 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 Inserir no início LL – contiguidade física Inserção como primeiro nodo da LL LL não inicia no início do arranjo 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 L7 5 8 Inserir no início Novo nodo Algoritmo InserirIniLLArr Entradas: LL (TipoLista) IA, FA, IL, FL (inteiro) InfoNodo (TipoNodo) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Variável auxiliar: Ind (inteiro) início se (IA = IL) e (FA = FL) então {arranjo vazio} Sucesso falso senão início se IL = 0 então {lista vazia} IL FL IA senão se IL > IA então {a lista não inicia na primeira posição do arranjo} IL IL-1 senão início {Deslocar nodos para cima} para Ind de FL incr -1 até IL faça LL[Ind+1] LL[Ind] FL FL+1 fim LL[IL] InfoNodo Sucesso verdadeiro fim fim LL – contiguidade física Algoritmo: Inserir no Inicío de LL implementada sobre Arranjo LL – contiguidade física Inserção como último nodo da LL LL não termina no final do arranjo 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 Inserir no final LL – contiguidade física Inserção como último nodo da LL LL não termina no final do arranjo 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 L7 5 8 Inserir no final Novo nodo LL – contiguidade física Inserção como último nodo da LL LL termina no final do arranjo 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 L6 5 8 Inserir no final LL – contiguidade física Inserção como último nodo da LL LL termina no final do arranjo 1 2 4 3 7 6 9 10 LL L1 L2 L3 L4 L5 L6 5 8 1 2 4 3 7 6 9 10 LL L1 L2 L3 L4 L5 L6 L7 5 8 IL IA FL FA Inserir no final IL FL IA FA Novo nodo Algoritmo InserirFimLLArr Entradas: LL (TipoLista) IA, FA, IL, FL (inteiro) InfoNodo (TipoNodo) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Variável auxiliar: Ind (inteiro) início se (IA = IL) e (FA = FL) então Sucesso falso senão início se IL = 0 {LISTA VAZIA} então IL FL IA senão se FL < FA {TEM ESPAÇO ATRÁS} então FL FL+1 senão início {DESLOCAR NODOS PARA BAIXO} para Ind de IL incr 1 até FL faça LL[Ind-1] LL[Ind] IL IL-1 fim LL[FL] InfoNodo Sucesso verdadeiro fim fim LL – contiguidade física Algoritmo: Inserir no Fim de LL implementada sobre Arranjo LL – contiguidade física Inserção no meio de LL 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 Inserir Posição: 3o nodo LL – contiguidade física Inserção no meio de LL 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 1 2 4 3 7 6 9 10 LL L1 L2 L3 L4 L5 L6 5 8 IL FL IA FA Inserir Posição: 3o nodo Novo nodo LL – contiguidade física Algoritmo: Inserir em LL implementada sobre Arranjo na Posição K Posição K K = 1 no início da LL K = FL – IL + 2 no final da lista Caso haja deslocamento para cima, caso haja espaço senão, para baixo Sucesso retorna falso quando não existe espaço no arranjo para a inserção posição inválida para inserção na LL LL – contiguidade física Algoritmo: Inserir em LL implementada sobre Arranjo na Posição K Algoritmo InserirLLArrPosK Entradas: LL (TipoLista) IA, FA, IL, FL (inteiro) K (inteiro) InfoNodo (TipoNodo) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Variável auxiliar: Ind (inteiro) início se (IA = IL e FA = FL) ou (K > FL-IL+2) ou (K 0) ou (IL = 0 e K 1) então Sucesso falso senão início se IL = 0 então IL FL IA senão se FL FA então início {DESLOCAR NODOS PARA CIMA} para Ind de FL incr -1 até IL+K-1 faça LL[Ind+1] LL[Ind] FL FL+1 fim senão início {DESLOCAR NODOS PARA BAIXO} para Ind de IL incr 1 até IL+K-2 faça LL[Ind-1] LL[Ind] IL IL - 1 fim LL[IL+K-1] InfoNodo Sucesso verdadeiro fim fim A posição não poderá ser maior do que o número de nodos da lista antes da inserção Otimizar: deslocar nodos da metade para o fim se a inserção for na primeira metade da lista, e da metade para o início se for na segunda metade desde que haja espaço no lado considerado 40 20 90 80 70 0 1 3 4 2 6 5 7 8 9 K 3 K > 3 LL – contiguidade física Algoritmo: Inserir em LL implementada sobre Arranjo na Posição K LL – contiguidade física Remoção de um nodo 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 Remover 3o nodo LL – contiguidade física Remoção de um nodo 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 1 2 4 3 7 6 9 10 LL L1 L2 L3 L4 5 8 IL FL IA FA Remover 3o nodo Algoritmo RemoverKLLArr Entradas: LL (TipoLista) IL, FL (inteiro) K (inteiro) Saídas: LL (TipoLista) IL, FL (inteiro) Sucesso (lógico) Variável auxiliar: Ind (inteiro) início se (K 0) ou (K > FL-IL+1) então Sucesso falso senão início para Ind de IL+K-1 incr 1 até FL-1 faça LL[Ind] LL[Ind+1] FL FL-1 se FL = IL–1 então IL FL 0 Sucesso verdadeiro fim fim LL – contiguidade física Algoritmo: Remover nodo de ordem K de LL implementada sobre Arranjo Acessar para Consulta a informações do nodo Alteração de algum campo de informação do nodo LL – contiguidade física Acesso a um nodo LL – contiguidade física Acesso a um nodo O nodo a ser acessado pode ser identificado por sua ordem na lista Ex: 2º nodo através de seu conteúdo Ex: nodo de conteúdo “D” 1 2 4 3 7 6 9 10 LL IL FL IA FA L1 L2 L3 L4 L5 5 8 1 2 4 3 7 6 9 10 LL IL FL IA FA A B C D E 5 8 LL – contiguidade física Algoritmo AcessarKLLArr Entradas: LL (TipoLista) IL, FL (inteiro) K (inteiro) Saídas: InfoNodo (TipoNodo) Sucesso (lógico) início se (K 0) ou (K > FL-IL+1) ou (IL = 0) então Sucesso falso senão início InfoNodo LL[IL+K-1] Sucesso verdadeiro fim fim Algoritmo: Acessar “k-ésimo” nodo da LL implementada sobre Arranjo Algoritmo PosValLLArr Entradas: LL (TipoLista) IL, FL (inteiro) ValBuscado (TipoValor) Saída: Posição(inteiro) Variáveis auxiliares: I (inteiro) Achou (lógico) início Achou falso Posição 0 I IL enquanto (I FL) e (não Achou) faça se LL[I].Valor = ValBuscado então início Posição I Achou verdadeiro fim senão I I+1 fim TipoNodo = registro Valor: inteiro Info: TipoInfo fim registro LL – contiguidade física Algoritmo: Fornece a posição na LL do nodo com um determinado Valor LL – contiguidade física Exercícios Implementar as seguintes operações sobre Listas Lineares com contigüidade física: Criação Inserção Exclusão Busca Utilize: struct dados { int codigo; int idade; } int vet[10]; * Quando desejamos resolver um problema através de um programa utilizando o computador a primeira providência que devemos tomar é a de elaborar o algoritmo mais adequado para o programa. Para cada programa desenvolvido na disciplina de algoritmos vocês conceberam um algoritmo antes de implementar o mesmo. A eficiência do algoritmo vai depender da disposição dos dados, ou elementos que servem de base para a resolução do problema, na memória. Quando maior for a facilidade o computador achar na memória estes dados, maior será a eficiência do programa. Para entender a relação entre eficiência e algoritmo vamos ver o exemplo da agenda telefônica. Supondo que freqüentemente utilizamos a agenda telefônica para descobrir o número de telefone de nossos conhecidos, é conveniente dispor de uma relação dos números, organizada na agenda. Se a organização for feita por ordem alfabética, a agenda de fato ajuda. Se, porém, organizássemos nossa agenda pela ordem de altura das pessoas, com raras exceções, a agenda se tornaria difícil de manusear. Se soubermos organizar a nossa agenda de forma a tornar a busca de um número de telefone bastante facilitada, então, estaremos executando a tarefa de busca de forma eficiente.