Salve! Ho provato a creare una funzione che dato un bst di stringhe, mi crei un array che contenga ordinatamente il contenuto di esso. Le mie funzioni sono per un tipo di dato generico, quindi in questo caso associo una libreria per il tipo string. Il mio codice è il seguente
main.c
#include <stdio.h>
#include <stdlib.h>
#include "bst.h"
#include "tipostring.h"
int main()
{
BST albero=NULL;
char *dato;
char **A=NULL; void **arr=NULL;
int i,a,n;
printf("Costruisci l'albero di stringhe:\n\n");
printf("Quanti elementi vuoi inserire? ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
dato=getInputSTRING();
albero=bst_insert(albero,(void*)dato,compareSTRING);
}
printf("\nL'abero inserito è il seguente:\n");
bst_stampaOrd(albero, stampaSTRING);
arr=(void **)A;
a=bst_creaArrayOrd(albero,&arr,0,arrayOrdSTRING);
printf("Array creato.\n");
printf("a=%d\n",a);
for(i=0;i<a;i++) printf("A[%d]=%s\n",i,A[i]);
return 0;
}
bst.h
#ifndef BST_H_INCLUDED
#define BST_H_INCLUDED
typedef struct bst * BST;
typedef int (*COMPARE)(void * , void * );
typedef void (*PRINT) (void *);
typedef void (*ARRAY) (void ****,int, void *);
BST bst_insert(BST t, void* item, COMPARE compare);
void bst_stampaOrd (BST t, PRINT print);
int bst_creaArrayOrd(BST t, void ***A, int i, ARRAY arrayOrd);
#endif // BST_H_INCLUDED
bst.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bst.h"
typedef struct bst {
void *campo;
struct bst *sx;
struct bst *dx;
}bst;
BST bst_insert(BST t, void* item, COMPARE compare)
{
if (t!=NULL)
{
if ( compare(item,t->campo) < 0)
t->sx=bst_insert(t->sx,item,compare);
else if ( compare(item,t->campo) > 0 )
t->dx=bst_insert(t->dx,item,compare);
return t;
}
else
{
BST tmp=(bst *)malloc(sizeof(bst));
if(tmp == NULL) {
printf("Error: allocation bst node failed!\n");
exit(-1);
}
tmp->campo=item;
tmp->sx=NULL;
tmp->dx=NULL;
return tmp;
}
}
void bst_stampaOrd (BST t, PRINT print)
{
if (t==NULL) return;
if (t->sx!=NULL) bst_stampaOrd(t->sx,print);
print(t->campo);
if(t->dx!=NULL) bst_stampaOrd(t->dx,print);
return;
}
int bst_creaArrayOrd(BST t, void ***A, int i, ARRAY arrayOrd)
{
if(t!=NULL)
{
printf("Sono nella libreria!\n");
printf("Chiamo la funzione a sinistra\n"); i=bst_creaArrayOrd(t->sx,A,i,arrayOrd); printf("Fatto sinistra!\n");
arrayOrd(&A,i,t->campo); printf("Sono nella chiamante. a[%d]=%s", i, (char*)(*A)[i]);
i++; printf("Incrementato i\n");
printf("Chiamo la funzione a destra\n");i=bst_creaArrayOrd(t->dx,A,i,arrayOrd); printf("Fatto destra!\n");
}
return i;
}
tipostring.h
#ifndef TIPOSTRING_H_INCLUDED
#define TIPOSTRING_H_INCLUDED
int compareSTRING (void* a, void*b);
char * getInputSTRING (void);
void stampaSTRING (void * a);
char * getRandomSTRING (int n);
void arrayOrdSTRING (void ****a,int i, void *dato);
#endif // TIPOSTRING_H_INCLUDED
tipostring.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tipostring.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);
}
void arrayOrdSTRING (void ****a,int i, void *dato)
{
printf("Sono nella funzione array string!\n");
char ****A;
A= (char ****)a;
**A=(char **)realloc((**A), (i+1)*sizeof(char *)); if(**A==NULL) printf("Errore allocazione!\n");
printf("Prima allocazione\n");
*(*A)[i]=(char *)malloc(80*sizeof(char)); if (*(*A)[i]==NULL) printf("Errore allocazione!\n");
printf("Seconda allocazione\n");
printf("dato =%s\n", (char*)dato);
*(*A)[i]=(char *)dato;
printf("a[%d] = %s\n", i, *(*A)[i]);
return;
}
Allora io credo di sbagliare sicuramente qualcosa o riguardo il passaggio dell'array, oppure l'allocazione di esso. In ogni caso tutti quegli orribili printf li ho inseriti proprio per provare dove si ferma l'esecuzione del programma (la compilazione viene eseguita) , e ho notato che la mia funzione inserisce nell'array la prima stringa, mentre nell'inserimento della seconda il programma si blocca proprio all'allocazione
*(*A)[i]=(char *)malloc(80*sizeof(char));