AlocaçãodeMemória
Estruturas de Dados I
Prof Fabiana Lorenzi
Alocaçãodememória
● Um programa referencia a memória do computador através
das variáveis;
● Uma variável é uma posição de memória onde é armazenado
um determinado valor ou um endereço onde está armazenado
um valor.
Variáveis
● Estáticas
● Dinâmicas
Estáticas
● Este tipo de variável utiliza a memória estática e seus
atributos (tipo, tamanho) são conhecidos durante a
compilação do programa;
● Após a alocação de uma variável estática, ela só será
liberada da memória quando o programa for encerrado.
Dinâmicas
● É uma variável que ao se executar o programa, é
necessário que haja uma alocação de memória para sua
manipulação e, caso não haja mais utilidade, o espaço
alocado pode ser liberado novamente para a memória livre;
● São chamadas de variáveis apontadores.
Apontadores
Apontadores
Exemplo:
Algoritmo exemplo_apontador
inicio
inteiro *p // declaração do tipo apontador
aloca (p) // alocação da variável p
p = 14;
. . .
libera (p) // liberação da variável p
fim
Apontadores
Apontadores
Comandos:
Aloca (p): criará uma variável dinâmica do tipo base.
Esta variável será apontada pelo apontador “p”.
Libera (p): destruirá a variável apontada por “p” e
retornará o espaço ocupado anteriormente para a memória
livre, que poderá ser utilizada para outra variável
dinâmica. “P” torna-se indefinido, isto é, aponta para um
local (endereço de memória) indefinido.
Nulo: é uma maneira de “zerar” o apontador.
ListasSimplesmenteEncadeadas
● os componentes da lista estão dispostos fisicamente
independentes da sua posição na estrutura lógica;
● os componentes se relacionam através de elos
(apontadores).
ListasSimplesmenteEncadeadas
Cada nodo da lista com encadeamento simples é formado por 1
registro de, no mínimo, 2 campos.
Dado é o campo que contém a informação a ser armazenada na
lista;
Próximo é o campo que contém o endereço físico (relativo) do
próximo nodo da lista.
ListasSimplesmenteEncadeadas
Declaração de um nodo (registro) de um lista:
registro nodo
inicio
inteiro dados;
registro nodo *proximo;
fim
Declaração em C
struct nodo {
int dados;
struct nodo *proximo;
};
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
3 6 8 nulo
11 novo nodo a ser inserido !!!!
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
3 6 8 nulo 11 nulo
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
3 6 8 11 nulo
Mas como fazer isso sem saber os nomes dos nodos???
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
3 6 8 nulo 11
pfimprimeiro
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
11
p
nulo3 6 8 nulo
fimprimeiro
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
11
p
nulo3 6 8
fimprimeiro
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
11
p
nulo3 6 8
fimprimeiro
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
Parâmetros do procedimento:
primeiro - armazena o endereço do primeiro nodo da lista;
fim - armazena o endereço do último nodo da lista;
valor - o elemento que será inserido na lista;
sinal - flag utilizada para sabermos se deu tudo certo no
procedimento.
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
3 nulo
p
dados proximo
primeiro
fim
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
Exemplo:inserirumnovovalornofinal
dalista(àdireita)
3
dadosproximo
primeiro
fim
p
nulo7
proximodados
Exercícios
Utilizando uma lista simplesmente encadeada conforme vimos
nos slides anteriores, escreva as seguintes subrotinas:
1) Inserir o 4o nodo da lista;
2) Inserir antes do 5o nodo da lista.
Nestes casos é necessário contas quantos nodos a
lista tem e utilizar uma variável apontadora auxiliar para
"andar" na lista.

Aula apontadores