Funzione creaCammino(albero T,char c)

di il
2 risposte

Funzione creaCammino(albero T,char c)

Devo implementare un programma C che prenda in input un albero binario di caratteri e un carattere. Se tale carattere è una foglia il programma deve creare dinamicamente un stringa che contenga i caratteri che formano il percorso radice-carattere.
Esempio:
f
/ \
a v
/ \ \
s b r

invocando il metodo cammino(T,'b') deve restituire un stringa del tipo: "fab/0"
mentre se gli do: cammino(T,'v') deve restituire NULL
Ho scritto il seguente codice, ma ahimè mi imbatto nel maledetto segmentation fault

#include "libreria.h"

int esiste_foglia(albero T,char f) {
    if (T==NULL)
        return 0;
    else
        if((T->info==f)&&(T->left==NULL)&&(T->right==NULL))
            return 1;

        else return esiste_foglia(T->left,f)|| esiste_foglia(T->right,f);


}

int is_leaf(albero T,char c) {
    if (T==NULL)
        return 0;
    else if(T->left==NULL&&T->right==NULL&&T->info==c)
        return 1;
    return is_leaf(T->left,c) || is_leaf(T->right,c);
}


int profondita_foglia(albero T, char c) {
    if (T==NULL || !is_leaf(T,c) || T->info==c)
        return 0;
    else
        if(is_leaf(T->left,c))
            return 1+profondita_foglia(T->left,c);
        else
            if(is_leaf(T->right,c))
                return 1+profondita_foglia(T->right,c);


}

char* cammino(albero T,char c){

    int i;
    char* stringa=NULL;
    int p;
    if(T==NULL || !is_leaf(T,c))
        return 0;

    else
        p=profondita_foglia(T,c);
        stringa=calloc(p+2,sizeof(char));
        i=0;
        cammino_aux(T,stringa,c,&i);
        return stringa;

}




void cammino_aux(albero T,char* s,char c,int* i) {


    if(T->info==c) {
        s[*i]=c;
        *i=*i+1;
        s[*i]='\0';
    }
    else
        if (is_leaf(T->left,c)){
            s[*i]=T->info;
            *i=*i+1;
            cammino_aux(T->left,s,c,*i);
        }
        else {
            if (is_leaf(T->right,c)){
                s[*i]=T->info;
                *i=*i+1;
                cammino_aux(T->right,s,c,*i);

            }
        }
}

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte