Aula 3 – Alocação Dinâmica - CAFW - UFSM
Aula 3 – Alocação Dinâmica - CAFW - UFSM
Aula 3 – Alocação Dinâmica - CAFW - UFSM
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Aula</strong> 3 <strong>–</strong> <strong>Alocação</strong> <strong>Dinâmica</strong><br />
Universidade Federal de Santa Maria<br />
Colégio Agrícola de Frederico Westphalen<br />
Curso Superior de Tecnologia em Sistemas de Internet<br />
Prof. Bruno B. Boniati <strong>–</strong> www.cafw.ufsm.br/~bruno
Ponteiros ou Apontadores
• É um conceito/recurso de bastante utilidade e<br />
pré-requisito para as próximas aulas;<br />
Vamos a um exemplo ...
int a;<br />
int* p;<br />
a = 10;<br />
p = &a;<br />
*p = 5;<br />
printf(“%d”,a);<br />
p<br />
a<br />
10
int A, B, S;<br />
int* ptA;<br />
int* ptB;<br />
int* ptS;<br />
A = 2;<br />
B = 3;<br />
ptA = &A;<br />
ptB = &B;<br />
ptS = &S;<br />
*ptS = *ptA + *ptB;<br />
printf("Resultado = %d",S);<br />
2 3 5
int* e;<br />
e = malloc(sizeof(int));<br />
if (e == NULL) {<br />
printf(“Memória cheia”);<br />
exit(1);<br />
}<br />
*e = 10;<br />
printf(“e = %p e contém %d”,e,*e);<br />
free(e);<br />
E se eu acessar “e”<br />
antes de inicializá-lo?
int* p;<br />
int* r;<br />
int* q;<br />
p = malloc(sizeof(int));<br />
*p = 5;<br />
q = malloc(sizeof(int));<br />
q = p;<br />
r = p;<br />
printf("%d",*p);<br />
5<br />
O que acontece com o<br />
espaço alocado para q?
int* e;<br />
e = malloc(sizeof(int));<br />
while (e != NULL) {<br />
e = malloc(sizeof(int));<br />
}<br />
printf("MEMÓRIA CHEIA");
void troca(int a, int b) {<br />
int aux;<br />
aux = a;<br />
a = b;<br />
b = aux;<br />
}<br />
Quanto vale x ?<br />
void main {<br />
int x = 5;<br />
int y = 10;<br />
troca(x, y);<br />
printf(“x = %d, y = %d”, x,y);<br />
}
void troca(int* a, int* b) {<br />
int aux;<br />
aux = *a;<br />
*a = *b;<br />
*b = aux;<br />
}<br />
Agora sim!<br />
void main {<br />
int x = 5;<br />
int y = 10;<br />
troca(&x, &y);<br />
printf(“x = %d, y = %d”, x,y);<br />
}
• Por valor:<br />
O valor enviado para a subrotina é copiado e todas<br />
as alterações feitas na subrotina afetam apenas a<br />
cópia do parâmetro;<br />
As alterações da subrotina não afetam a variável original;<br />
• Por referência:<br />
Neste caso o parâmetro não é apenas uma cópia<br />
do valor, mas sim a variável (o endereço) original.<br />
As alterações da subrotina são feitas diretamente na variável<br />
original.
<strong>Aula</strong> 4 <strong>–</strong> Estr. Clássicas - Pilha<br />
Universidade Federal de Santa Maria<br />
Colégio Agrícola de Frederico Westphalen<br />
Curso Superior de Tecnologia em Sistemas para a Internet<br />
Prof. Bruno B. Boniati <strong>–</strong> www.cafw.ufsm.br/~bruno
LIFO - Last In First Out
• Para que um elemento entre<br />
na pilha ele será sempre<br />
colocado no topo da mesma;<br />
• Para que um elemento seja<br />
retirado da pilha, ele sempre<br />
sairá do topo da mesma.
LIFO<br />
• Last in, first out<br />
• Os elementos da pilha são retirados na ordem<br />
inversa à ordem em que foram introduzidos: o<br />
último a entrar é o primeiro a sair;<br />
• Não são permitidas operações sobre quaisquer<br />
nodos, somente sobre aqueles definidos pela<br />
organização da pilha.
• Recurso de “desfazer” dos editores (de texto ou<br />
editores gráficos)<br />
• Para descontrair ... desenho do Joãozinho ...<br />
(a professora pede que cada aluno participe de um desenho colaborativo)<br />
Juquinha desenhou o<br />
chão;<br />
Mariazinha desenhou um<br />
caixa sobre o chão;<br />
Pedrinho completou ...<br />
Isso é uma casa;<br />
Zezinho desenhou a neve<br />
sobre o telhado da casa;<br />
Sandrinha fez o sol;<br />
Joãozinho desenhou seu<br />
pai juntando o sabonete<br />
no chão do banheiro;<br />
E a professora?<br />
Teve que desfazer o<br />
desenho do Joãozinho!!!
• Recurso de “voltar” entre os endereços mais<br />
recentemente visitados de um browser;<br />
www.cafw.ufsm.br/~bruno/disciplinas/estrutura_dados<br />
www.cafw.ufsm.br/~bruno<br />
www.cafw.ufsm.br<br />
www.ufsm.br<br />
Voltar<br />
Voltar
• Controle de chamadas de subrotinas<br />
(procedimentos e funções);<br />
Sempre que o programa encontrar uma chamada a<br />
uma subrotina ele irá empilhar o contexto atual da<br />
aplicação (valores de variáveis, endereços de retorno)<br />
em uma pilha;<br />
Na medida em que as chamadas vão sendo<br />
finalizadas a pilha vai sendo desfeita;
• Uma pilha permite basicamente duas<br />
operações:<br />
Empilhar (push)<br />
Desempilhar (pop)<br />
• Antes de pensar os algoritmos, precisamos:<br />
Pensar em uma estratégia de armazenamento da<br />
estrutura;<br />
Pensar na interface das operações que irão<br />
manipular os dados da estrutura;
• Para representar fisicamente uma pilha<br />
podemos usar diferentes estratégias:<br />
Contigüidade física <strong>–</strong> com o uso de vetores;<br />
<strong>Alocação</strong> dinâmica ou encadeamento <strong>–</strong> com a<br />
utilização de ponteiros;<br />
• Vamos adotar a opção 1 (utilização de vetores)<br />
em função da simplicidade dos algoritmos;<br />
• A organização lógica da pilha independe da<br />
estratégia de armazenamento.
#define MAX 100<br />
typedef struct pilha {<br />
int topo;<br />
int vetor[MAX];<br />
} Pilha;<br />
De que forma<br />
posso representar<br />
uma pilha?
Qual é a<br />
interface<br />
do TAD<br />
Pilha?<br />
• Inicialmente precisamos:<br />
• Criar uma pilha;<br />
• Empilhar um elemento;<br />
• Desempilhar um elemento;<br />
• Destruir uma pilha (liberar a memória<br />
ocupada pela mesma);<br />
• Saber se a pilha está vazia;<br />
• Saber se a pilha está cheia;<br />
• etc...
Pilha* criaPilha();<br />
void liberaPilha(Pilha* p);<br />
int empilha(Pilha* p, int v);<br />
int desempilha(Pilha* p, int* v);<br />
int estahVazia(Pilha* p);<br />
int estahCheia(Pilha* p);
• Vetor[6]:<br />
7<br />
12<br />
40<br />
30 50<br />
20<br />
10<br />
topo = 6<br />
topo = 5<br />
topo = 4<br />
topo = 3<br />
topo = 2<br />
topo = 1<br />
topo = 0<br />
• Empilha 10<br />
• Empilha 20<br />
• Empilha 30<br />
• Desempilha<br />
• Empilha 50<br />
• Empilha 40<br />
• Empilha 12<br />
• Empilha 7<br />
• Empilha 9<br />
• Erro! Pilha cheia
Pilha* criaPilha();<br />
• Aloca memória para a estrutura física;<br />
• Inicializa o topo do vetor;<br />
• Retorna um ponteiro para a estrutura criada;<br />
void liberaPilha(Pilha* p);<br />
• Recebe um ponteiro para uma estrutura do tipo<br />
Pilha e libera a memória ocupada por ela;
int estahVazia(Pilha* p);<br />
•<br />
O topo está na posição zero!<br />
int estahCheia(Pilha* p);<br />
•<br />
O topo está na última posição!
int empilha(Pilha* p, int v);<br />
• Recebe um ponteiro para uma estrutura do tipo<br />
Pilha e um valor a ser empilhado;<br />
• Verifica se a pilha já não está cheia;<br />
• Se não está, então ...<br />
Coloca o elemento na posição indicada pelo topo<br />
Incrementa o valor de topo;<br />
• A função empilha() retorna 1 (um) se o valor foi<br />
empilhado ou então retorna 0 (zero) se não foi<br />
possível empilhar;
int desempilha(Pilha* p, int* v);<br />
• Recebe um ponteiro para uma estrutura do tipo<br />
Pilha e um ponteiro para uma variável inteira;<br />
• Verifica se a pilha já não está vazia;<br />
• Se não está, então ...<br />
Retira o elemento da posição logo abaixo do topo;<br />
Decrementa o valor de topo;<br />
• A função desempilha() retorna 1 (um) se o valor<br />
foi desempilhado ou então retorna 0 (zero) se<br />
não foi possível desempilhar;
a = criaPilha();<br />
empilha(a,10);<br />
empilha(a,20);<br />
empilha(a,30);<br />
int x;<br />
desempilha(a, &x);<br />
printf("Elemento '%d' retirado",x);<br />
liberaPilha(a);
Exercícios para fixação
Dado o seguinte programa escrito em C:<br />
2007<br />
#include <br />
Qual é a resposta que<br />
int main(void)<br />
será impressa na<br />
{<br />
tela?<br />
int n[] = {7, 8, 9};<br />
(a) Valor: 7 Valor: 8<br />
int *p;<br />
(b) Valor: 7 Valor: 7<br />
(c) Valor: 8 Valor: 9<br />
p = &n[0];<br />
(d) Valor: 7 Valor: 9<br />
p++;<br />
(e) Valor: 9 Valor: 9<br />
printf("Valor: %d ", *p);<br />
(*p)++;<br />
printf("Valor: %d\n", *p);<br />
}
• Escreva um programa para simular o<br />
funcionamento de uma Torre de Hanói.<br />
• Você deve mover todos os discos de uma torre<br />
para outra sem jamais colocar um disco maior<br />
encima de um disco menor.<br />
• Para simplificar utilize uma torre<br />
com três discos;