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