Ecco le funzioni che ho fin ora scritto.. Per il momento con il main scritto così funziona tutto tranne l'inserimento manuale di char...
abrgenerico.h
#ifndef ABRGENERICO_H_INCLUDED
#define ABRGENERICO_H_INCLUDED
typedef struct abrgenerico * ABR;
typedef int (*COMPARE)(void * , void * );
typedef void (*STAMPA) (void *);
ABR abr_insert(ABR t, void* item, COMPARE compare);
void abr_stampaInOrder (ABR t, STAMPA stamp);
void abr_stampaPreOrder (ABR t, STAMPA stamp);
void abr_stampaPostOrder (ABR t, STAMPA stamp);
ABR abr_cancel(ABR t, void *elem, COMPARE compare);
ABR abr_staccamin(ABR p, ABR t);
ABR abr_cancellanodo(ABR t);
ABR abr_svuota (ABR t);
#endif // ABRGENERICO_H_INCLUDED
abrgenerico.c
#include <stdio.h>
#include <stdlib.h>
#include "abrgenerico.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(item,t->info);
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));
if(tmp == NULL) {
printf("Error: allocation abr node failed!\n");
exit(-1);
}
tmp->info=item;
tmp->sx=NULL;
tmp->dx=NULL;
return tmp;
}
}
void abr_stampaInOrder (ABR t, STAMPA stamp)
{
if (t==NULL) return;
if (t->sx!=NULL) abr_stampaInOrder(t->sx,stamp);
stamp(t->info);
if(t->dx!=NULL) abr_stampaInOrder(t->dx,stamp);
return;
}
void abr_stampaPreOrder (ABR t, STAMPA stamp)
{
if (t==NULL) return;
stamp(t->info);
if (t->sx!=NULL) abr_stampaPreOrder(t->sx,stamp);
if(t->dx!=NULL) abr_stampaPreOrder(t->dx,stamp);
return;
}
void abr_stampaPostOrder (ABR t, STAMPA stamp)
{
if (t==NULL) return;
if (t->sx!=NULL) abr_stampaPostOrder(t->sx,stamp);
if(t->dx!=NULL) abr_stampaPostOrder(t->dx,stamp);
stamp(t->info);
return;
}
ABR abr_cancel(ABR t, void *elem, COMPARE compare)
{
if (t==NULL) return t;
if (compare(elem,t->info)<0)
t->sx=abr_cancel(t->sx,elem,compare);
else if (compare(elem,t->info)>0)
t->dx=abr_cancel(t->dx,elem,compare);
else
t=abr_cancellanodo(t);
return t;
}
ABR abr_cancellanodo(ABR t)
{
ABR tmp=(abr *)malloc(sizeof(abr));
tmp=t;
if(tmp->sx == NULL) t=tmp->dx;
else if (tmp->dx == NULL) t=tmp->sx;
else
{
tmp=abr_staccamin(t,t->dx);
t->info=tmp->info;
}
free(tmp);
return t;
}
ABR abr_staccamin(ABR p, ABR t)
{
if (t!=NULL)
{
if (t->sx!=NULL) return abr_staccamin(t,t->sx);
else
{
if (t==p->sx) p->sx=t->dx;
else p->dx=t->dx;
}
}
return t;
}
ABR abr_svuota (ABR t)
{
if (t!=NULL)
{
t->sx=abr_svuota(t->sx);
t->dx=abr_svuota(t->dx);
t=abr_cancellanodo(t);
}
return t;
}
dati.h
#ifndef DATI_H_INCLUDED
#define DATI_H_INCLUDED
#include "datoINT.h"
#include "datoSTRING.h"
#include "datoFLOAT.h"
#include "datoCHAR.h"
#endif // DATI_H_INCLUDED
datoINT.h
#ifndef DATOINT_H_INCLUDED
#define DATOINT_H_INCLUDED
int compareINT(void * a, void * b);
int * getInputINT (void);
int * getRandomInt (void);
void stampaINT (void * a);
#endif // DATOINT_H_INCLUDED
datoINT.c
#include <stdio.h>
#include <stdlib.h>
#include "datoINT.h"
int compareINT (void * a, void * b)
{
int a1= *(int*) a;
int b1= *(int*) b;
return a1-b1;
}
int * getInputINT (void)
{
int *in;
in = (int *)malloc(sizeof(int));
if(in == NULL){
printf("Error: allocation int failed\n");
exit(-1);
}
printf("Inserisci un valore intero:");
scanf("%d", in);
return in;
}
int * getRandomInt (void)
{
int *d;
d = (int *)malloc(sizeof(int));
if(d == NULL){
printf("Error: allocation int failed\n");
exit(-1);
}
*d = (rand()%100) ;
return d;
}
void stampaINT (void * a)
{
int a1= *(int*) a;
printf("%d\n", a1);
}
datoFLOAT.h
#ifndef DATOFLOAT_H_INCLUDED
#define DATOFLOAT_H_INCLUDED
int compareFLOAT (void * a, void * b);
float * getInputFLOAT (void);
float * getRandomFLOAT (void);
void stampaFLOAT (void * a);
#endif // DATOFLOAT_H_INCLUDED
datoFLOAT.c
#include <stdio.h>
#include <stdlib.h>
#include "datoFLOAT.h"
int compareFLOAT (void * a, void * b)
{
float a1= *(float*) a;
float b1= *(float*) b;
if((a1-b1)<0) return -1;
if((a1-b1)>0) return 1;
else return 0;
}
float * getInputFLOAT (void)
{
float *in;
in = (float *)malloc(sizeof(float));
if(in == NULL){
printf("Error: allocation int failed\n");
exit(-1);
}
printf("Inserisci un valore float:");
scanf("%f.3", in);
return in;
}
float * getRandomFLOAT (void)
{
float *d;
d = (float *)malloc(sizeof(float));
if(d == NULL){
printf("Error: allocation int failed\n");
exit(-1);
}
*d = (rand()%100) ;
return d;
}
void stampaFLOAT (void * a)
{
float a1= *(float*) a;
printf("%f.3\n", a1);
}
datoCHAR.h
#ifndef DATOCHAR_H_INCLUDED
#define DATOCHAR_H_INCLUDED
int compareCHAR (void * a, void * b);
char * getInputCHAR (void);
char * getRandomCHAR (void);
void stampaCHAR (void * a);
#endif // DATOCHAR_H_INCLUDED
datoCHAR.c
#include <stdio.h>
#include <stdlib.h>
#include "datoCHAR.h"
int compareCHAR (void * a, void * b)
{
int a1= *(int*) a;
int b1= *(int*) b;
return a1-b1;
}
char * getInputCHAR(void)
{
char *in;
in = (char *)malloc(sizeof(char));
printf("Inserisci un carattere: ");
scanf("%c", in);
return in;
}
char * getRandomCHAR (void)
{
char *d;
d = (char *)malloc(sizeof(char));
*d = (rand()%100) ;
return d;
}
void stampaCHAR (void * a)
{
char a1= *(char*) a;
printf("%c\n", a1);
}
datoSTRING.h
#ifndef DATOSTRING_H_INCLUDED
#define DATOSTRING_H_INCLUDED
int compareSTRING (void* a, void*b);
char * getInputSTRING (void);
void stampaSTRING (void * a);
char * getRandomSTRING (int n);
#endif // DATOSTRING_H_INCLUDED
datoSTRING.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "datoSTRING.h"
int compareSTRING (void* a, void*b)
{
char* a1= (char *) a;
char* b1= (char *) b;
return strcmp(a1,b1);
}
char * getInputSTRING (void)
{
char *in;
in = (char*)malloc(sizeof(char));
if(in == NULL){
printf("Error: allocation string failed\n");
exit(-1);
}
printf("Inserisci una stringa:");
scanf("%s", in);
return in;
}
char * getRandomSTRING (int n)
{
int i,c;
char *str=(char*)malloc(sizeof(char)*(n+1));
for(i=0;i<n;i++)
{
c=97+(rand()%25);
*(str+i)=(char) c;
}
*(str+n)='\0';
return str;
}
void stampaSTRING (void * a)
{
char *a1= (char*) a;
printf("%s\n", a1);
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "abrgenerico.h"
#include "dati.h"
int main()
{
int n;
ABR albero=NULL;
int *datoi; char *datos, *datoc; float *datof;
int i;
int sceltatipo;
int scelta;
int sceltains;
printf("COSTRUISCI ABR.\n\n");
istr1:printf("Scegli il tipo di dati\n");
printf("1) Intero.\n");
printf("2) Float.\n");
printf("3) Carattere.\n");
printf("4) Stringa\n");
printf("5) Struct.\n\n");
scanf("%d",&sceltatipo);
printf("Quanti elementi vuoi inserire?");
scanf("%d",&n);
printf("1- Inserisci dati casuali;\n2- Inserisci dati manualmente\n");
scanf("%d",&sceltains);
switch (sceltatipo)
{
case 1:
for (i=0;i<n;i++)
{
if (sceltains==1) datoi=getRandomInt();
else if(sceltains==2) datoi=getInputINT();
albero=abr_insert(albero,(void*)datoi, compareINT);
}
abr_stampaInOrder(albero, stampaINT);
goto istr2;
case 2:
for (i=0;i<n;i++)
{
if (sceltains==1) datof=getRandomFLOAT();
else if(sceltains==2) datof=getInputFLOAT();
albero=abr_insert(albero,(void*)datof, compareFLOAT);
}
abr_stampaInOrder(albero, stampaFLOAT);
goto istr2;
case 3:
for (i=0;i<n;i++)
{
if (sceltains==1) datoc=getRandomCHAR();
else if(sceltains==2) datoc=getInputCHAR();
albero=abr_insert(albero,(void*)datoc, compareCHAR);
}
abr_stampaInOrder(albero, stampaCHAR);
goto istr2;
case 4:
for (i=0;i<n;i++)
{
if (sceltains==1) {int x=rand()%10; datos=getRandomSTRING(x);}
else if (sceltains==2) datos=getInputSTRING();
albero=abr_insert(albero,(void*)datos, compareSTRING);
}
abr_stampaInOrder(albero, stampaSTRING);
goto istr2;
case 5:
default:
printf("::ERRORE:: Scelta non valida!");
goto istr1;
}
istr2:printf("\n1) Visualizza Abr.\n");
printf("2) Cancella Abr.\n");
printf("3) Cancella un nodo dell'Abr.\n");
scanf("%d",&scelta);
switch(scelta)
{
case 1:
if (albero==NULL) printf("Albero vuoto!\n");
else if (sceltatipo==1)
abr_stampaInOrder(albero,stampaINT);
else if (sceltatipo==2)
abr_stampaInOrder(albero,stampaFLOAT);
else if (sceltatipo==3)
abr_stampaInOrder(albero,stampaCHAR);
else if (sceltatipo==4)
abr_stampaInOrder(albero,stampaSTRING);
goto istr2;
case 2:
albero=abr_svuota(albero);
goto istr2;
case 3:
printf("Abr salvato:\n");
if (sceltatipo==1)
abr_stampaInOrder(albero,stampaINT);
else if (sceltatipo==2)
abr_stampaInOrder(albero,stampaFLOAT);
else if (sceltatipo==3)
abr_stampaInOrder(albero,stampaCHAR);
else if (sceltatipo==4)
abr_stampaInOrder(albero,stampaSTRING);
printf("\nScelta nodo da cancellare... \n");
if (sceltatipo==1)
{datoi=getInputINT();
albero=abr_cancel(albero,(void*)datoi,compareINT);
printf("Abr dopo la cancellazione:\n");
abr_stampaInOrder(albero,stampaINT);}
if(sceltatipo==2)
{datof=getInputFLOAT();
albero=abr_cancel(albero,(void*)datof,compareFLOAT);
printf("Abr dopo la cancellazione:\n");
abr_stampaInOrder(albero,stampaFLOAT);}
if(sceltatipo==3)
{datoc=getInputCHAR();
albero=abr_cancel(albero,(void*)datoc,compareCHAR);
printf("Abr dopo la cancellazione:\n");
abr_stampaInOrder(albero,stampaCHAR);}
else if (sceltatipo==4)
{datos=getInputSTRING();
albero=abr_cancel(albero,(void*)datos,compareSTRING);
printf("Abr dopo la cancellazione:\n");
abr_stampaInOrder(albero,stampaSTRING);}
goto istr2;
}
return 0;
}