19.04.2013 Views

Aula 3 – Alocação Dinâmica - CAFW - UFSM

Aula 3 – Alocação Dinâmica - CAFW - UFSM

Aula 3 – Alocação Dinâmica - CAFW - UFSM

SHOW MORE
SHOW LESS

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;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!