Esse é um header que fiz quando tava apreendendo mais sobre void e acabei misturando também Orientação a Objeto e C++. Assim, resultou nesse maravilhoso código que resolvi comenta-lo e disponibiliza-lo aqui para estudo futuro dos interressados. Certamente, tem maneiras melhores de fazer esse tipo de coisa em C++. Mas, serve de um exemplo excelente para C++ e um complemento para o artigo de ponteiros void.

  



Esconder código-fonte

/*
   ALOCACAO DINAMICA & METODO DA FILA
         Escrito em Maio/2004 by Ricardo Rodrigues Lucca(jllucca)
*/

#include <string.h> /* mem */
#include <stdlib.h> /* malloc e free */

/*
 * VARIAVEIS GLOBAIS, ESTRUTURAS e TIPOS
 */
typedef struct nodo_basic {
   void *nodo;
   size_t tam_nodo;
   nodo_basic *next;
} nodo_basic; //Tipo usado nos elementos da fila

// Esta eh a classe fila. Classe é uma especie de struct que permite agrupar variaveis e funções. A três sub-agrupamentos: publicos, protegidos e privados.
class fila {
   private: // Somente funções dessa classe acessam o que esta abaixo.
     nodo_basic *start; // inicio da fila (remoção - procura)
     nodo_basic *end; // termino da fila (insercao)
     long int elements; // quantidade de elementos
     
   public:
     fila( void ); /* construtor */
     bool add( void *x, size_t tam_x ); 
     bool remove( void );
     bool posindex( int X );
     void *get();
     long int total( void );
     ~fila( void );/* destrutor */
};

// Essa funcao eh chamada toda vez que declaramos uma variavel dessa classe, pois eh seu construtor.
fila::fila( void )
{
   end = new nodo_basic; /* cria primeiro nodo */
      
   end->nodo = NULL; /* Limpa o conteudo do nodo */
   end->next = NULL;
   end->tam_nodo = 0;
   
   start = end; /* Atribui o primeiro nodo ao inicio */
   elements = 0; /* Numero de elementos atuais */
   
}

// Os "::" serve para dizer que estamos definindo uma função de nome a direita com uma classe que ficara a esquerda.(Esquerda e direita é referente aos "::"
// Essa função insere elementos no final da fila e retorna um true em caso de sucesso ou false em caso de erro.
bool fila::add( void *x, size_t tam_x )
{
   end->next = new nodo_basic;/* cria novo nodo */
   if (end->next == NULL) /* testa se falta memoria */
      return false;
   
   end->nodo = malloc(tam_x); /* aloca memoria para o cont. do nodo */
   if (end->nodo == NULL)
      return false;
   memmove(end->nodo, x, tam_x); /* end->nodo = X; */
   end->tam_nodo = tam_x;
      
   end = end->next; /* coloca o novo nodo como ultimo */
   elements++; //incrementa elements
   
   return true;
}

// Remove o primeiro elemento da fila
bool fila::remove( void )
{
   void *aux = start;

   if (elements == 0)
      return false;
      
   start = start->next;
   free( aux );
   
   elements--;
   return true;
}

// Descola X elementos para a direita.
bool fila::posindex( int X )
{
   while ( X ) {
     if (add( start->nodo, start->tam_nodo ) == false)
        return false;
     remove();
     X--;
   }
   
   return true;
}

// Retorna o primeiro elemento da fila. DEVE ser usada com a função acima.
void* fila::get( void )
{
   return start->nodo;
}

// Retorna o total de elementos da fila.
long int fila::total( void )
{
   return elements;
}

// Toda vez que a classe for ser "apagada" da memoria essa função é chamada e destroi os dados armazenados.
fila::~fila( void )
{
   while ( remove() )
        ;

   delete start;
   delete end;
}

Scripts recomendados

Raizes reais e complexas de uma equação de 2º grau

Escrevendo Colorido no C

utilities_linux.h - Biblioteca com diversas funções para o Linux

Jogo Campo Minado

Patch para Zsnes 1.51 com GCC>=4.3


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts