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

Conjunto de Mandelbrot (Fractal)

Comando switch

Números Primos

Contagem de elementos de um array

Faixa salarial de funcionários


  

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