Pessoal, meu exemplo é uma pilha, mas poderia ser qualquer outra estrutura de dados.
Gostaria que minha pilha pudesse armazenar qualquer tipo de dado, facilitando a criação da estrutura que representa cada elemento.
Em C++ o mecanismo de templates, assim como os genéricos em Java, poderia resolver isso para mim, mas em C não existe essa funcionalidade. Uma alternativa seria usar uniões, mas mesmo assim, caso eu queira inserir um novo tipo de dado na pilha eu teria que modificar a união.
Implementei a seguinte solução, usando elementos com valores do tipo void*:
#ifndef PILHA_H
#define PILHA_H
#include <stdbool.h>
typedef struct elemento {
void *valor;
struct elemento *anterior;
} Elemento;
typedef struct pilha {
int tamanho;
Elemento *topo;
} Pilha;
void init( Pilha *pilha );
void push( Pilha *pilha, void *valor );
void* pop( Pilha *pilha );
bool empty( Pilha *pilha );
void print( Pilha *pilha, void (*print_func)(Elemento*) );
#endif // PILHA_H
#include <stdlib.h>
#include <stdbool.h>
#include "pilha.h"
void init( Pilha *pilha ) {
pilha->tamanho = 0;
pilha->topo = NULL;
}
void push( Pilha *pilha, void *valor ) {
Elemento *novoElemento = (Elemento*) malloc( sizeof( Elemento ) );
novoElemento->valor = valor;
novoElemento->anterior = pilha->topo;
pilha->tamanho++;
pilha->topo = novoElemento;
}
void* pop( Pilha *pilha ) {
if ( !empty( pilha ) ) {
Elemento *temp = pilha->topo;
void *valor = temp->valor;
pilha->topo = pilha->topo->anterior;
pilha->tamanho--;
free( temp );
return valor;
}
return NULL;
}
bool empty( Pilha *pilha ) {
if ( pilha->topo == NULL ) {
return true;
} else {
return false;
}
}
void print( Pilha *pilha, void (*print_func)(Elemento*) ) {
Elemento *atual = pilha->topo;
while ( atual != NULL ) {
print_func( atual );
atual = atual->anterior;
}
}
#include <stdio.h>
#include <stdlib.h>
#include "pilha.h"
void print_string( Elemento* e );
int main() {
char v1[30] = "joao";
char v2[30] = "maria";
char v3[30] = "jose";
Pilha pilha;
init( &pilha );
push( &pilha, v1 );
push( &pilha, v2 );
push( &pilha, v3 );
void* e = pop( &pilha );
printf( "Desempilhou: %s\n", (char*) e );
print( &pilha, &print_string );
return 0;
}
void print_string( Elemento* e ) {
printf( "%s\n", (char*) e->valor );
}
Gostaria de saber se este é o caminho mais usual adotado pela comunidade C nesse tipo de situação.
[]'s