¡Buenas!
Si quieres crear funciones genericas que trabajen sobre listas, vectores, arboles... puedes recurrir a punteros void, y punteros a funciones para facilitar la insercion, busqueda...:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int intcmp(void *v1, void *v2)
{
if(*((int*)v1) < *((int*)v2))
return -1;
if(*((int*)v1) > *((int*)v2))
return 1;
return 0;
}
int floatcmp(void *v1, void *v2)
{
if(*((float*)v1) < *((float*)v2))
return -1;
if(*((float*)v1) > *((float*)v2))
return 1;
return 0;
}
void* buscar(void *valor, void *vector, int nelementos, unsigned int tam_dato, int (*cmp)(void *, void*))
{
int i;
for(i = 0 ; i < nelementos ; i++)
if(!cmp(valor, ((char*)vector) + i * tam_dato))
return ((char*)vector) + i * tam_dato);
return NULL;
}
int main(int argc, char *argv[])
{
int vint[] = {1,2,3,4,5},x,*iptr;
int vfloat[] = {1.,2.,3.,4.,5.},y,*fptr;
x = 3;
if(iptr = (int*) buscar(&x,vint,5,sizeof(int),intcmp))
printf("%d pertenece al vector de enteros\n", *iptr
); else
printf("%d no pertenece al vector de enteros\n", x
);
y = 7.;
if(fptr = (float*) buscar(&y,vfloat,5,sizeof(float),floatcmp))
printf("%f pertenece al vector de enteros\n", *fptr
); else
printf("%f no pertenece al vector de enteros\n", y
);
return 0;
}
Prueba a compilarlo y ejecutarlo (en este momento no tengo ningun compilador a mano asi que no se si hay errores). A pesar de que de esta forma ganas generalidad con el codigo, estas perdiendo algo de claridad. Ya ves que para poder realizar desplazamientos a partir de un puntero a void, primero tienes que convertirlo a char y desplazar el numero de bytes que corresponde segun el tipo de dato con el que estes trabajando. Tambien es un poco caotica la funcion de comparacion que tienes que crear para cada tipo de dato, pero al final sales ganando en que puedes reutilizar tu codigo siempre que te haga falta, lo unico que tendras que hacer es crear la funcion de comparacion para el tipo de dato que quieras.
Ademas, para un mismo tipo de dato, puedes construir funciones de comparacion distintas. Imagina que tienes una bibilioteca con su correspondiente struct libro y una funcion que te ordene un vector segun la funcion de comparacion que le pases como parametro. Podras ordenar los libros por orden alfabetico de titulo, de autor, por fecha de publicacion o por lo que quieras, tan solo tendras que crear una funcion que compare los libros segun los parametros que quieras comparar.
¡Saludos!