ALOCAÇÃO DINÂMICA DE MEMÓRIA PASCAL ALOCAÇÃO DINÂMICA DE MEMÓRIA
Alocação Estática de Memória Definimos exatamente as variáveis necessárias para resolver um problema Usada quando conhecemos a quantidade e a dimensão das variáveis necessárias Ex.: Var Nr1, nr2, nr3: integer; // variáveis tipo inteiro Temperaturas: array[1..24] of integer; // variável estruturada homogênea do tipo inteiro com uma dimensão e 24 elementos
Alocação Dinâmica de Memória Permite criar variáveis dinamicamente, em tempo de execução, a medida em que forem necessárias Usada quando não sabemos a quantidade ou a dimensão das variáveis que necessitamos para resolver um problema Em Pascal, C e C++ a alocação dinâmica de memória é implementada via pointer
Pointer Um pointer é uma variável que aponta para uma outra variável, esta última criada em tempo de execução Isto permite definir, durante a execução de um programa, quantas variáveis de um tipo de pointer serão criadas, e a dimensão dessas variáveis O pointer tem um tipo: ele só pode apontar para variáveis de seu tipo Pode-se imaginar o pointer como contendo um endereço de uma variável
Exemplo de alocação estática Var Nr1, nr2, nr3: integer; nr1 Todas do tipo inteiro nr2 nr3
Exemplo de alocação dinâmica Var Var1, var2: ^integer var1 Podem apontar para variáveis do tipo inteiro var2
nr1, nr2: inteiro // variável estática Var1, var2: ^inteiro // pointer Begin ... nr1 nr2 var1 var2 nr1 15 15 nr2 nr1 15 new (var1) var1^ 25 nr2 var1^ 25 25
Lista encadeada por pointer início nó Encadeamento
Exemplo: agenda por pointer Algoritmo agendaPointer (* agenda em pointer com inclusão no início *) Tipo tcontato = ^rcontato (* pointer *) Rcontato = registro nome fone proximo: tcontato (* recursão *) fim Var Primeiro, novo, atual, ultimo: tcontato
Primeiro nil // para inicializar com nulo Inicio Primeiro nil // para inicializar com nulo ............. // repetição e menu com opções Procedimento incluirContatoInicio (* procedimento para incluir contato no inicio *) inicio New (novo) // alocação dinâmica de memória Leia (novo^.nome, novo^.fone) (* orientar e testar *) Novo^.proximo nil Se primeiro = nil Então primeiro novo // primeira inclusão Senão // demais inclusões Novo^.proximo primeiro Primeiro novo fim
Exemplo de agenda Primeiro contato: zé fone 45 Segundo contato: rui fone 80 Terceiro contato: lui fone 10 primeiro Ze 45 primeiro Rui 80 Ze 45 primeiro Lui 10 Rui 80 Ze 45
Procedimento listarContatos (* procedimento para listar os contatos *) Inicio Atual primeiro Enquanto atual <> nil faça Escreva(atual^.nome, atual^.fone) Atual atual^.proximo fim
procedimento incluirContatoFim (* procedimento para incluir contato no fim – inclusão mantendo a ordem cronológica *) new (novo) // alocação dinâmica de memória leia (novo^.nome, novo^.fone) // orientar e testar novo^.proximo nil se primeiro = nil então primeiro novo // primeira inclusão Ultimo novo senão // demais inclusões ultimo^.proximo novo ultimo novo fim
Exemplo de agenda Primeiro contato: zé fone 45 Segundo contato: rui fone 80 Terceiro contato: lui fone 10 ultimo primeiro Ze 45 ultimo primeiro Ze 45 Rui 80 ultimo primeiro Ze 45 Rui 80 Lui 10
Novo exemplo linear Agenda que permita manter os nomes e telefones de contatos em ordem alfabética em uma lista circular O contato atual deve ser apresentado na tela Opções: Incluir novo contato – este passa a ser o atual Excluir o contato atual – atual será o próximo Alterar o telefone do contato atual Apresentar o próximo – será o atual Apresentar o anterior – será o atual Consultar um contato pelo nome - será o atual Listar todos os contatos – mantido o atual
Exemplo não linear Agenda que permita manter os nomes e telefones de contatos em ordem alfabética em uma árvore binária Opções: Incluir novo contato Alterar o telefone de um contato Consultar um contato pelo nome Listar todos os contatos em ordem alfabética