Variveis Dinmicas Caixas de Ns Inhama Neves Ferraz
- Slides: 30
Variáveis Dinâmicas Caixas de Nós Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade Federal Fluminense ferraz@ic. uff. br
Sumário Dados estáticos e dinâmicos Variáveis dinâmicas Caixa de nós Conceito n Funções que tratam de caixas de nós n Implementação em memória secundária 2
Variáveis Dinâmicas Caixas de Nós
Dados estáticos e dinâmicos Os tipos de dados e as estruturas de dados utilizados nos algoritmos e programas podem ser estáticos e dinâmicos No primeiro caso a alocação de espaço de memória é feita uma só vez e é imutável Para melhor aproveitar os espaços disponíveis pode-se postergar as solicitações de memória até a ocasião de sua necessidade real e liberar espaços tornados desnecessários em processos que evoluam dinamicamente 4
Variáveis Dinâmicas Pode-se utilizar um processo de alocação de memória de forma dinâmica, isto é, só requisitar memória no momento de utilização de cada registro Isto é feito declarando uma variável como sendo um ponteiro para um tipo específico de objeto e criando dinamicamente objetos desse tipo e atribuindo seu endereço à variável ponteiro 5
Caixa de nós (1) A alocação de espaços requeridos pelos algoritmos e programas pode ser considerada como a manipulação de registros originados em uma “CAIXA DE NÓS” Esta caixa de nós contém, inicialmente, um número finito de registros Os programas só tem acesso à caixa de nós através das operações getnode e freenode A criação de uma lista de nós disponíveis ou caixa de nós é feita pelo procedimento create_avail Os nós são obtidos de um “array” quando se utiliza a memória principal O procedimento é o mesmo em memória secundária quando os nós são obtidos seqüencialmente de um arquivo de acesso direto 6
Caixa de nós (2) getnode remove um registro da caixa de nós e o fornece ao programa freenode devolve à caixa de nós um registro que não mais esteja sendo utilizado pelo programa. a operação getnode em uma caixa de nós vazia mostra qeue a memória reservada para as estruturas de dados do programa é insuficiente Esta situação configura um transbordamento ou “overflow” 7
Caixa de nós (3) 8
Gerenciamento de espaço disponível (“available”) Avail * § Alocação de um novo nó * . . . * ^ If Avail = Null then sem-espaço (a) else begin Getnode : = Avail; (b) Avail : = Next(Avail); (c) Next(Getnode) : = Null end; Avail * * Getnode * . . * ^ ^ Avail Getnode * Avail * * . . ^
Liberação de um nó Procedimento Freenode(Q) INFO NEXT Q Avail (a) Next(Q) : = Avail (b) Info(Q) : = Null (c) Avail : = Q * * . . . ^ Q NEXT Avail * * . . . ^
Algoritmos
FUNÇÕES QUE TRATAM DAS CAIXAS DE NÓS Implementação por ponteiros inteiros sobre um “array” Definição de dados Constantes 12
Tipo de registro Tipo de dado t_caixa array[0. . NUMNODES - 1] de reg 13
Algoritmos Início avail ZERO Para i variando de ZERO até NUMNODES - 2 caixa[i]. next i + 1 Fim do Para caixa[NUMNODES - 1]. next MENOS_UM Fim do procedimento 14
Método create_avail() void create_avail(void){ int i; avail = 0; for(i=0; i<num. Nodes-1; i++){ node[i]. next = i+1; } node[num. Nodes-1]. next = -1; } 15
Método getnode() Início Se (avail = MENOS_UM) então retorne(MENOS_UM) Fim do Se p avail caixa[avail]. next retorne(p) Fim do procedimento 16
Getnode (2) int get. Node(void){ int p; if (avail==-1){ std: : cout<<"Overflown"; exit(1); } p=avail; avail=node[avail]. next; return p; } 17
Freenode (1) Início caixa[p]. next avail p retorne Fim do procedimento 18
Freenode (2) void freenode(int p) { node[p]. next = avail; avail = p; return; } /* end freenode */ 19
Implementação em memória
Caixa de nós em memória
Getnode em C++ template <class T> Node<T> *Get. Node(const T& item, Node<T> *next. Ptr=NULL) { Node<T> *new. Node; //declaração de ponteiro para nó new. Node=new Node<T>(item, next. Ptr); //alocação de memória // passagem de item e nextptr para o construtor // encerrar se a alocação falhar if (new. Node==NULL) {cerr<<“A alocação de memória falhou"<<endl; exit(1); } return new. Node; } 22
Implementação em memória secundária
Getnode em C++ //Retorna um nó (Registro) disponível do arquivo de acesso direto Int get. Node() { Bucket *header; Bucket *area. Trab; int posicao; header = new Bucket; area. Trab = new Bucket; header = &(ler. Bucket(0)); posicao = header->proximo; if (posicao == 0) cout << "Nao ha mais nos disponiveis"; else { //Atualiza o indicador do próximo registro disponível area. Trab = &(ler. Bucket(posicao)); header->proximo = area. Trab->proximo; gravar. Bucket(0, *header); } delete(header); delete(area. Trab); return posicao; } 24
Freenode em C++ //Libera um registro e o coloca de volta na caixa de nós disponíveis Void free. Node(int posicao) { Bucket *header; Bucket *area. Trab; header = new Bucket; area. Trab = new Bucket; header = &(ler. Bucket(0)); area. Trab = &(ler. Bucket(posicao)); area. Trab->proximo = header->proximo; header->proximo = posicao; gravar. Bucket(0, *header); gravar. Bucket(posicao, *area. Trab); delete(header); delete(area. Trab); } 25
Getnode em Java (1) /* getnode * Parametros: * arq: arquivo de acesso direto da caixa de nós */ public static int getnode(Random. Access. File arq) { Bucket header = new Bucket(); int endereco = 0; try { arq. seek(0); header. read(arq); // Extrair de header o endereço do próximo registro disponível endereco = header. proximo; if (header. proximo == -1) { System. out. println("Nao ha mais nos!"); // - Arquivo lotado } 26
Getnode em Java (2) else // Ainda ha nos { Bucket area. Trabalho = new Bucket(); arq. seek(endereco*Bucket. size()); area. Trabalho. read(arq); header. proximo = area. Trabalho. proximo; arq. seek(0); header. write(arq); } } catch(IOException ex) { ex. print. Stack. Trace(); } finally { return endereco; } } 27
Freenode em Java (1) /* Devolver a caixa de nos um bucket não mais necessário. * Parametros: * end. Bucket: endereço do bucket a ser liberado **/ public static void freenode(int end. Bucket) { Bucket area. De. Trabalho = new Bucket(); Bucket header = new Bucket(); // int prox. Bucket. Disponivel; //endereço de bucket que pode ser alocado 28
Freenode em Java (2) try { arq. Direto. seek(end. Bucket*Bucket. size()); area. De. Trabalho. read(arq. Direto); arq. Direto. seek(0); header. read(arq. Direto); area. De. Trabalho. set. Proximo(header. proximo); // Susbstitui em header o valor do antigo proximo bucket disponivel // pelo endereco do bucket devolvido a caixa de nos. header. set. Proximo(end. Bucket); //Limpa o bucket devolvido a caixa de nos Cisao. Inicializar(area. De. Trabalho); //Grava o bucket devolvido a caixa de nos e o header atualizado. arq. Direto. seek(end. Bucket*Bucket. size()); area. De. Trabalho. write(arq. Direto); arq. Direto. seek(0); header. write(arq. Direto); } 29
Freenode em Java (3) catch (IOException ex) { ex. print. Stack. Trace(); } } 30
- Modelo logit ordenado
- Dinmicas
- Denis paulo rocha ferraz
- Dinmicas
- Dr luis ferraz urologista
- Dinmicas
- Paulo reglus neves freire
- Ozias paese neves
- Maria augusta ferreira neves idade
- Marilyn monroe murio por burlarse de dios
- Neves program célja
- Miguel sousa neves
- Marilyn monroe murio despues de burlarse de dios
- Dados indicação e operação
- Caixas ited
- O dono de um restaurante comprou oito caixas
- Uma escola recebeu a doação de 3 caixas de 1000 livros
- Joao e andre empurram caixas identicas