A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Estrutura de Dados (DPADF 0056)

Apresentações semelhantes


Apresentação em tema: "Estrutura de Dados (DPADF 0056)"— Transcrição da apresentação:

1 Estrutura de Dados (DPADF 0056)
Aula 3 – Alocação Dinâmica Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet Prof. Bruno B. Boniati –

2 Ponteiros ou Apontadores

3 Variável que guarda o endereço de uma outra variável
Ponteiro É um conceito/recurso de bastante utilidade e pré-requisito para as próximas aulas; Variável que guarda o endereço de uma outra variável Vamos a um exemplo ...

4 Quanto vale a? Ponteiros ... * a p 10 int a; int* p; a = 10; p = &a;
printf(“%d”,a); Quanto vale a?

5 O que acontece na memória?
int A, B, S; int* ptA; int* ptB; int* ptS; A = 2; B = 3; ptA = &A; ptB = &B; ptS = &S; *ptS = *ptA + *ptB; printf("Resultado = %d",S); 2 3 5

6 E se eu acessar “e” antes de inicializá-lo?
Ponteiros ... * E se eu acessar “e” antes de inicializá-lo? int* e; e = malloc(sizeof(int)); if (e == NULL) { printf(“Memória cheia”); exit(1); } *e = 10; printf(“e = %p e contém %d”,e,*e); free(e);

7 O que acontece na memória?
int* p; int* r; int* q; p = malloc(sizeof(int)); *p = 5; q = malloc(sizeof(int)); q = p; r = p; printf("%d",*p); 5 O que acontece com o espaço alocado para q?

8 Ponteiros ... * int* e; e = malloc(sizeof(int)); while (e != NULL) { }
printf("MEMÓRIA CHEIA");

9 Passando ponteiros para subrotinas
void troca(int a, int b) { int aux; aux = a; a = b; b = aux; } Quanto vale x ? void main { int x = 5; int y = 10; troca(x, y); printf(“x = %d, y = %d”, x,y); }

10 Passando ponteiros para subrotinas
void troca(int* a, int* b) { int aux; aux = *a; *a = *b; *b = aux; } Agora sim! void main { int x = 5; int y = 10; troca(&x, &y); printf(“x = %d, y = %d”, x,y); }

11 Passagem de parâmetros
Por valor: O valor enviado para a subrotina é copiado e todas as alterações feitas na subrotina afetam apenas a cópia do parâmetro; As alterações da subrotina não afetam a variável original; Por referência: Neste caso o parâmetro não é apenas uma cópia do valor, mas sim a variável (o endereço) original. As alterações da subrotina são feitas diretamente na variável original.

12 Estrutura de Dados (DPADF 0056)
Aula 4 – Estr. Clássicas - Pilha Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para a Internet Prof. Bruno B. Boniati –

13 LIFO - Last In First Out

14 O que define uma pilha? Para que um elemento entre na pilha ele será sempre colocado no topo da mesma; Para que um elemento seja retirado da pilha, ele sempre sairá do topo da mesma.

15 Estratégia LIFO Last in, first out
Os elementos da pilha são retirados na ordem inversa à ordem em que foram introduzidos: o último a entrar é o primeiro a sair; Não são permitidas operações sobre quaisquer nodos, somente sobre aqueles definidos pela organização da pilha.

16 Aplicações de Pilha Recurso de “desfazer” dos editores (de texto ou editores gráficos) Para descontrair ... desenho do Joãozinho ... (a professora pede que cada aluno participe de um desenho colaborativo) Juquinha desenhou o chão; Mariazinha desenhou um caixa sobre o chão; Pedrinho completou ... Isso é uma casa; Zezinho desenhou a neve sobre o telhado da casa; Sandrinha fez o sol; Joãozinho desenhou seu pai juntando o sabonete no chão do banheiro; E a professora? Teve que desfazer o desenho do Joãozinho!!!

17 Aplicações de Pilha (Cont.)
Recurso de “voltar” entre os endereços mais recentemente visitados de um browser; Voltar Voltar

18 Aplicações de Pilha (Cont.)
Controle de chamadas de subrotinas (procedimentos e funções); Sempre que o programa encontrar uma chamada a uma subrotina ele irá empilhar o contexto atual da aplicação (valores de variáveis, endereços de retorno) em uma pilha; Na medida em que as chamadas vão sendo finalizadas a pilha vai sendo desfeita;

19 Pilha - Implementação Uma pilha permite basicamente duas operações:
Empilhar (push) Desempilhar (pop) Antes de pensar os algoritmos, precisamos: Pensar em uma estratégia de armazenamento da estrutura; Pensar na interface das operações que irão manipular os dados da estrutura;

20 Organização física Para representar fisicamente uma pilha podemos usar diferentes estratégias: Contiguidade física – com o uso de vetores; Alocação dinâmica ou encadeamento – com a utilização de ponteiros; Vamos adotar a opção 1 (utilização de vetores) em função da simplicidade dos algoritmos; A organização lógica da pilha independe da estratégia de armazenamento.

21 Etapa 1 – Definição conceitual
De que forma posso representar uma pilha? #define MAX 100 typedef struct pilha { int topo; int vetor[MAX]; } Pilha;

22 O que podemos fazer com uma pilha?
Inicialmente precisamos: Criar uma pilha; Empilhar um elemento; Desempilhar um elemento; Destruir uma pilha (liberar a memória ocupada pela mesma); Saber se a pilha está vazia; Saber se a pilha está cheia; etc... Qual é a interface do TAD Pilha?

23 Etapa 2 – Definição das Operações
Pilha* criaPilha(); void liberaPilha(Pilha* p); int empilha(Pilha* p, int v); int desempilha(Pilha* p, int* v); int estahVazia(Pilha* p); int estahCheia(Pilha* p);

24 Funcionamento Empilha 10 Vetor[6]: Empilha 20 Empilha 30 Desempilha
topo = 6 Empilha 30 topo = 5 Desempilha 7 Empilha 50 topo = 4 12 Empilha 40 Empilha 12 topo = 3 40 Empilha 7 topo = 2 Empilha 9 30 50 Erro! Pilha cheia topo = 1 20 10 topo = 0

25 void liberaPilha(Pilha* p);
Pilha* criaPilha(); Aloca memória para a estrutura física; Inicializa o topo do vetor; Retorna um ponteiro para a estrutura criada; void liberaPilha(Pilha* p); Recebe um ponteiro para uma estrutura do tipo Pilha e libera a memória ocupada por ela;

26 int estahVazia(Pilha* p);
O que caracteriza uma pilha vazia? O topo está na posição zero! int estahCheia(Pilha* p); O que caracteriza uma pilha cheia? O topo está na última posição!

27 int empilha(Pilha* p, int v);
Recebe um ponteiro para uma estrutura do tipo Pilha e um valor a ser empilhado; Verifica se a pilha já não está cheia; Se não está, então ... Coloca o elemento na posição indicada pelo topo Incrementa o valor de topo; A função empilha() retorna 1 (um) se o valor foi empilhado ou então retorna 0 (zero) se não foi possível empilhar;

28 int desempilha(Pilha* p, int* v);
Recebe um ponteiro para uma estrutura do tipo Pilha e um ponteiro para uma variável inteira; Verifica se a pilha já não está vazia; Se não está, então ... Retira o elemento da posição logo abaixo do topo; Decrementa o valor de topo; A função desempilha() retorna 1 (um) se o valor foi desempilhado ou então retorna 0 (zero) se não foi possível desempilhar;

29 Etapa 3 – Implementação e Utilização
a = criaPilha(); empilha(a,10); empilha(a,20); empilha(a,30); int x; desempilha(a, &x); printf("Elemento '%d' retirado",x); liberaPilha(a);

30 Exercícios para fixação

31 Dado o seguinte programa escrito em C:
2007 #include <stdio.h> int main(void) { int n[] = {7, 8, 9}; int *p; p = &n[0]; p++; printf("Valor: %d ", *p); (*p)++; printf("Valor: %d\n", *p); } Qual é a resposta que será impressa na tela? (a) Valor: 7 Valor: 8 (b) Valor: 7 Valor: 7 (c) Valor: 8 Valor: 9 (d) Valor: 7 Valor: 9 (e) Valor: 9 Valor: 9

32 Torre de Hanói Escreva um programa para simular o funcionamento de uma Torre de Hanói. Você deve mover todos os discos de uma torre para outra sem jamais colocar um disco maior encima de um disco menor. Para simplificar utilize uma torre com três discos;


Carregar ppt "Estrutura de Dados (DPADF 0056)"

Apresentações semelhantes


Anúncios Google