Fila.h
Publicado por Ricardo Rodrigues Lucca 27/05/2004
[ Hits: 10.556 ]
Homepage: http://aventurasdeumdevop.blogspot.com.br/
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.
/*
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;
}
Raizes reais e complexas de uma equação de 2º grau
Rotinas para manipulação de matrizes
Lista simplesmente encadeada C
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Estou tentando ser legalista, mas tá complicado! (1)
PERFIL CRIADO NO SAMBA AD DC NÃO LOGA NO WINDOWS 10 E 11 (2)
É normal não gostar de KDE? (17)
PERFIL CRIADO NO SAMBA AD DC NÃO LOGA NO WINDOWS 10 E 11 (1)









