Buongiorno a tutti. Mi trovo davanti a qualcosa che programmo per la prima volta.. E cioè una libreria per la gestione di una lista doppiamente puntata che preveda l'inserimento di un qualsiasi tipo di dato(int,float,char ecc..). Ho cercato in rete vario materiale didattico.. e ciò che ho capito è che devo creare la mia struct, e definire un tipo di dato generico (che sia un puntatore a funzione che ritorna void) e sfruttare la proprietà delle callback. Quello che sono riuscito a scrivere fin ora è questo... (potrebbero essere eresie..)
lib.h
typedef struct abr * ABR;
typedef struct abr ** PABR;
typedef void(*TIPODATO)(void*); // dichiarazione dei puntatori di tipo TipoDato
typedef int(*CONFRONTA) (void*,void*); // dichiarazione dei puntatori di tipo Confronta
void getInputInt(void *k);
int confrontaInt (void *a, void *b);
void abr_insert(PABR t, int dim, int tipo, TIPODATO getValue, CONFRONTA Compare);
void copiaDato (void *dest,int dpos,void *src, int spos, int dim);
lib.c
typedef struct abrgenerico
{
TIPODATO info;
struct abrgenerico *sx;
struct abrgenerico *dx} abr;
void abr_insert(PABR t, int dim, int tipo, TIPODATO getValue, CONFRONTA Compare)
{
int elemento;
void *key=malloc(tipo);
getValue(key);
if (t!=NULL)
{
// if ( Compare(key,t->info)< 0 )
// t->sx=abr_insert(t->sx,tipo,getValue,Compare);
// else if (Compare(key,t->info)>0)
// t->dx=abr_insert(t->dx,tipo,getValue,Compare);
}
else {
ABR nodo=(abr *)malloc(sizeof(abr));
copiaDato(nodo->info,0,key,0,tipo);// t->info=key ?
nodo->sx=NULL;
nodo->dx=NULL;
}
free(key);
}
void copiaDato (void *dest,int dpos,void *src, int spos, int dim)
{
void *dest_addr=dest+(dpos+dim);
void *src_addr= src+(spos+dim);
memcpy(dest_addr,src_addr,dim);
}
void getInputInt(void *k)
{
printf("Inserisci un valore intero: ");
scanf("%d", (int*)k);
}
int confrontaInt (void *a, void *b)
{
int inta= *((int*)a);
int intb= *((int)b);
return ((inta>intb) ? 1 :
((inta<intb) ? -1 : 0));
}
Diciamo che ho scritto una prova solo per l'int.. Quindi ipotizzando un main di questo tipo
int main()
{
int n,sceltatipo;
PABR vAbr=NULL;
printf("Costruisci Abr:\n");
printf("Quanti elementi vuoi inserire?");
scanf("%d",&n);
abr_insert(vAbr,n,sizeof(int),&getInputInt,&confrontaInt);
return 0;
}
Non so se come approccio iniziale vada bene.. In ogni caso all'interno della funzione inserimento ho commentato delle righe.. in quanto per la variabile t->info dovrei fare un cast, che non riesco a scrivere nel caso appunto di un campo di una lista.
Ciò che cerco è qualche consiglio, se appunto ho iniziato bene, o se conoscente qualche manuale o libro online che posso consultare nel caso in cui non ci ho capito proprio niente!