La libreria del post precedente dovrebbe funzionare se il client utilizza solo un tipo di dato. Se invece vuoi che lo stesso client possa utilizzare piu tipi di dato, dovresti fare questa modifica:
abrgenerico.h
#ifndef ABRGENERICO_H_INCLUDED
#define ABRGENERICO_H_INCLUDED
typedef struct abr * ABR;
ABR abr_insert(ABR t, void* item);
#endif // ABRGENERICO_H_INCLUDED
abrgenerico.c
#include <stdio.h>
#include <stdlib.h>
#include "abrgenerico.h"
#include "dati.h"
typedef struct abrgenerico{
void * info;
struct abrgenerico *sx;
struct abrgenerico *dx
} abr;
ABR abr_insert(ABR t, void* item, COMPARE compare ){
int pos;
if (t!=NULL){
pos = compare(t->info, item);
if ( pos < 0)
t->sx=abr_insert(t->sx,item, compare);
else if ( pos > 0 )
t->dx=abr_insert(t->dx, item, compare);
return t;
}
else
{
ABR tmp=(abr *)malloc(sizeof(abr));
t->info=item;
t->sx=NULL;
t->dx=NULL;
return tmp;
}
}
dati.h
#ifndef DATI_H_INCLUDED
#define DATI_H_INCLUDED
#include "datoINT.h"
#include "datoSTRING.h"
/* Bisogna includere di volta in volta gli header dei tipi definiti */
typedef int (*COMPARE)(void * , void * );
#endif // DATI_H_INCLUDED
datoINT.h
#ifndef DATOINT_H_INCLUDED
#define DATOINT_H_INCLUDED
/* Libreria per la gestione degli int */
int compareINT(void * t, void * item);
#endif // DATOINT_H_INCLUDE
datoINT.c
//PER INTERI
#include <stdio.h>
#include <stdlib.h>
#include "datoINT.h"
/* Questa funzione va cambiata dall'utilizzatore a seconda del tipo di dato */
int compareINT(void * a, void * b){
/* implementazione della compare*/
}
datoSTRING.h
#ifndef DATOSTRING_H_INCLUDED
#define DATOSTRING_H_INCLUDED
/* Libreria per la gestione degli int */
int compareSTRING(void * t, void * item);
#endif // DATOSTRING_H_INCLUDED
datoSTRING.c
//PER LE STRINGHE
#include <stdio.h>
#include <stdlib.h>
#include "datoSTRING.h"
/* Questa funzione va cambiata dall'utilizzatore a seconda del tipo di dato */
int compareSTRING(void * a, void * b){
/* implementazione della compare*/
}
MAIN.c
/* Quando il main chiama la inserisci deve indicare in compare giusto */
....
abr_insert(tint, datoint, compareINT); //Per gli interi
...
abr_insert(tstring, datostring, compareSTRING); //Per le stringhe
....