160 likes | 333 Views
ALOCAÇÃO DINÂMICA DE MEMÓRIA. PASCAL. 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
E N D
ALOCAÇÃO DINÂMICA DE MEMÓRIA PASCAL
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
Var 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
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