BST di stringhe - Array ordinato

di il
9 risposte

BST di stringhe - Array ordinato

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));

9 Risposte

  • Re: BST di stringhe - Array ordinato

    Controlla getInputString. Stai allocando spazio per un solo carattere.
  • Re: BST di stringhe - Array ordinato

    skynet ha scritto:


    Controlla getInputString. Stai allocando spazio per un solo carattere.
    Non capisco l'errore.
  • Re: BST di stringhe - Array ordinato

    
    char * getInputSTRING (void)
    {
        char *in;
        in = (char*)malloc(sizeof(char)); // Qui allochi spazio per un solo char
        if(in == NULL){
            printf("Error: allocation string failed\n");
            exit(-1);
        }
        printf("Inserisci una stringa:");
        scanf("%s", in);
    
        return in;
    }
    
  • Re: BST di stringhe - Array ordinato

    char *in= (char *)malloc(50*sizeof(char));

    Va bene così?
  • Re: BST di stringhe - Array ordinato

    Se va bene per il programma non lo so.
    Dovrei metterlo sul compilatore e vedere un po'. Di sicuro allochi un vettore di char e non un solo char.

    Il mio intervento voleva chiarire solo l'intervento di skynet che mi ha preceduto.
  • Re: BST di stringhe - Array ordinato

    Sisi, intendevo se andava bene la correzione.
    Il resto non va bene perchè si blocca l'esecuzione, anche dopo questa modifica.
  • Re: BST di stringhe - Array ordinato

    Prova a controllare gli asterischi nella "arrayOrdSTRING". Guardandolo con superficialità ci sarebbero delle inconguenze.
  • Re: BST di stringhe - Array ordinato

    Si infatti ne sono sicura anche io. Ma è proprio perchè nel passaggio delle varie funzioni mi sono confusa, e ora sono ad un punto che non riesco a correggermi.
  • Re: BST di stringhe - Array ordinato

    Ho corretto, ora funziona!
    void arrayOrdSTRING (void ****a,int i, void *dato)
    {
    
        char ****A=(char ****)a;
        **A=(char **)realloc((**A), (i+1)*sizeof(char *));if(A==NULL) printf("Errore allocazione!\n");
        (**A)[i]=(char *)malloc(80*sizeof(char)); if ((**A)[i]==NULL) printf("Errore allocazione!\n");
        printf("dato =%s\n", (char*)dato);
        (**A)[i]=(char *)dato;
        printf("a[%d] = %s\n", i, (**A)[i]);
    
        return;
    }
    Volevo chiedervi un ulteriore cosa.. nel main utilizzo due variabili
    char **A;
    void **arr;
    facendo il cast a void della prima, nella seconda.. Per poi passare alla funzione &arr. In realtà faccio questo perchè passo l'indirizzo per conservare il valore dell'array alla fine della funzione, ma si può effetturare il cast e deferenziare nello stesso passaggio? come per esempio faccio con dato..
    #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");
        for(i=0;i<a;i++) printf("A[%d]=%s\n",i,arr[i]);
    
        return 0;
    
    }
Devi accedere o registrarti per scrivere nel forum
9 risposte