Aula 7 Encadeamento de Memória Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet Prof. Bruno B. Boniati www.cafw.ufsm.br/~bruno
Encadeamento de Memória através de Ponteiros
#define MAX 100 typedef struct fila { int comeco; int final; int vetor[max]; } Fila; Como poderia fazer para ter uma fila com mais de 100 posições?
Alocação estática ocorre em tempo de compilação. Quando o programa entra em execução ele reserva toda a memória necessária para sua execução; Alocação dinâmica ocorre em tempo de execução, não há reserva de memória na inicialização do programa. Quando há necessidade, a memória é alocada e posteriormente liberada.
São estruturas dinâmicas (a memória necessária é alocada durante a execução do programa); Devem ser utilizadas quando a organização física não necessariamente coincide com a organização lógica; No estudo das estruturas pilhas e filas a organização física contínua favorece a organização lógica, mas não é a única alternativa.
Como funciona? É necessário definir um tipo estruturado com um campo ou atributo para fazer a ligação entre elementos de mesmo tipo
Cada elemento de uma estrutura encadeada tem dois blocos: Elemento Área de Informações Área de Apontadores ou Elos a d b c f e
Como representar um encadeamento? struct elemento { int valor; struct elemento* proximo } Solução: PONTEIROS! (a estrutura contém um apontador para ela própria)
Uma fila poderia ser implementada como uma estrutura encadeada? 34 56 67 início 12 final FILA 14 9
typedef struct elemento { int valor; struct elemento* proximo; } Elemento; //Definição da fila //Dois apontadores: início e final typedef struct fila { Elemento* inicio; Elemento* final; } Fila;
Fila* criafila(); void liberafila(fila* p); As operações são exatamente as mesmas? int inserir(fila* p, int v); int retirar(fila* p, int* v); int estahvazia(fila* p); int estahcheia(fila* p);
NULL 34 NULL início final f NULL 67 56 NULL NULL 34 a f = criafila(); inserir(f, 34); inserir(f, 56); inserir(f, 67); int a; retirar(f, &a); liberafila();
Fila* criafila(); Aloca memória para a estrutura física; Inicializa os controles de início e o fim da fila; Retorna um ponteiro para a estrutura criada; void liberafila(fila* p); Recebe um ponteiro para uma estrutura do tipo fila e libera a memória ocupada por ela (será necessário percorrer todos os elementos da fila para liberar individualmente seus elementos);
int estahvazia(fila* p); O que caracteriza uma fila vazia? O início e o fim da fila não apontam para nenhum elemento; int estahcheia(fila* p); O que caracteriza uma fila cheia? Com alocação dinâmica a única chance da fila ficar cheia é se ela ocupar toda a memória do computador;
int inserir(fila* p, int v); Recebe um ponteiro para uma estrutura do tipo fila e um valor a ser enfileirado; Cria um novo elemento atribuindo o valor de v ; Se houve sucesso (há espaço para o novo elemento) O apontador do elemento apontado pelo fim da fila passa a apontar para o novo elemento; O apontador do fim da fila aponta para o novo elemento; Se o apontador de início é NULL então ele também aponta para o novo elemento;
int retirar(fila* p, int* v); Recebe um ponteiro para uma estrutura do tipo fila e um ponteiro para uma variável inteira; Verifica se a fila já não está vazia; Se não está, então... Guarda o valor do elemento apontado pelo início da fila no endereço da variável v ; O apontador de início da fila passa a apontar para o elemento que atualmente o elemento apontado pelo início da fila aponta; O elemento que era apontado pelo início da fila é destruído;
a = criafila(); inserir(a,10); inserir(a,20); inserir(a,30); int x; retirar(a, &x); printf("elemento '%d' retirado",x); liberafila(a); Mas isso é exatamente como já fizemos antes? A construção de um TAD abstrai do usuário final a forma como o mesmo foi implementado. Basta conhecer a interface do TAD para utilizá-lo.
Exercícios para fixação
Que tal re-implementar o TAD Pilha utilizando-se de encadeamento de memória? Basta um apontador para indicar o topo da pilha; O mesmo Elemento utilizado no exemplo da fila pode ser reaproveitado;