Estruturas de Dados Dinâmicas – Parte 1 Objetivo: Apresentar as estruturas de dados freqüentemente utilizadas na programação, por meio de diagramas e exemplos simples, para facilitar o entendimento e sua implementação. Listas; Filas; Pilhas; Listas Uma lista é uma coleção de elementos do mesmo tipo dispostos linearmente que podem ou não seguir uma determinada organização. Por exemplo: [E1, E2, E3, E4, E5, ..., En], onde n deve ser > = 0. Lista de Pagamentos: Prestação do carro; Cartão de crédito; Conta de luz; Condomínio; TV a cabo; Prestação do crediário. Listas Simples Implementadas por meio de arranjos: quando criamos uma lista para utilizá-la como uma estrutura de dados, pode-se utilizar como contêiner para o armazenamento dos dados um vetor ou uma matriz ; Lista de pagamentos: prestação do carro, cartão de crédito, conta de luz, condomínio, TV a cabo, prestação do crediário. Listas Encadeadas Encadeadas: quando usamos a alocação dinâmica, precisamos referenciar os elementos seguinte e anterior, de cada elemento da lista. O elemento 1 aponta para o elemento 2, o elemento 2 aponta para o elemento 3 e assim por diante: Listas Encadeadas Simples Os elementos da lista possuem apenas um ponteiro que aponta para o elemento sucessor ou próximo. Algoritmo ExemploListaSimples Tipo apontador: ^NoSimples NoSimples = registro valor: inteiro prox: apontador fim ListaSimples = registro primeiro: apontador ultimo: apontador fim Inicio ListaSimples.primeiro nulo ListaSimples.ultimo nulo Procedimento InserirNoFInal Procedimento InsereNo_fim (var novoNo: NoSimples) Inicio NovoNo^.prox nulo Se (ListaSimples.primeiro = nulo) Então ListaSimples.primeiro novoNo Fim-Se Se (ListaSimples.ultimo <> nulo) Então ListaSimples.ultimo^.prox novoNo Fim-Se ListaSimples.ultimo novoNo Fim Listas Duplamente Encadeadas Cada elemento possui um campo que aponta para o seu predecessor (anterior) e outro para o seu sucessor (próximo): Algoritmo ExemploListaDupla Tipo apontador: ^NoDuplo NoDuplo = registro valor: inteiro prox: apontador ant: apontador fim ListaDupla = registro primeiro: apontador ultimo: apontador numero_nos: inteiro fim inicio ListaDupla.numero_nos 0 ListaDupla.primeiro nulo ListaDupla.ultimo nulo Listas Circulares O ponteiro próximo do último elemento aponta para o primeiro; e o ponteiro anterior do primeiro elemento aponta para o último. Filas As filas (queues) são conjuntos de elementos (ou listas) cujas operações de inserção são feitas por uma extremidade e as de remoção, por outra extremidade. Algoritmo Fila Var Tipo fila_reg = registro inicio: inteiro fim: inteiro elemento: vetor [1..50] de inteiro fim total: inteiro fila: fila_reg Inicio fila.inicio 0 fila.fim 0 total 0 Procedimento enfileirar( elem: inteiro) inicio Se (cheia( ) = .f..) então fila.elemento[inicio] elem fila.fim fila.fim + 1 total total + 1 Se (fila.fim >= 50) então fila.fim = 0 fim-se senão Mostre( "Fila cheia!") fim-se fim Funcao desenfileirar( ): inteiro var excluido: inteiro inicio Se (vazia( ) = .f.) então excluido fila.elemento[inicio] fila.inicio fila.inicio + 1 Se (fila.inicio > = tamanho) então fila.inicio 0 fim-se total total - 1 retorne excluido senão excluido nulo retorne excluido fim-se fim Pilhas É uma lista linear em que todas as operações de inserção e remoção são feitas por um único extremo denominado topo. Algoritmo Pilha var Tipo pilha_reg = registro topo: inteiro elemento: vetor[1..50] de inteiros fim pilha: pilha_reg inicio pilha.topo -1 Função vazia( ): lógica início Se (pilha.topo = -1) então retorne .v. senão retorne .f. fim-se fim Função cheia( ): lógica início Se (pilha.topo >= 50) então retorne .v. senão retorne .f. fim-se fim Procedimento empilhar( elem: inteiro) início Se (cheia( ) = .f. ) então pilha.topo pilha.topo + 1 elemento.topo elem senão Mostre("Pilha Cheia!") fim-se Função desempilhar( ): inteiro var valorDesempilhado:inteiro início Se (vazia ( ) = .f.) então Mostre("Pilha vazia!") valorDesempilhado nulo retorne(valorDesempilhado) senão valorDesempilhado pilha.vetor[topo] pilha.topo pilha.topo - 1 retorne(valorDesempilhado) fim-se