Funzione free ricorsiva

di il
7 risposte

Funzione free ricorsiva

Salve ragazzi, è il mio primo post su questo forum. Sono bloccato da qualche giorno su un problemino che mi crea una funzione ricorsiva per deallocare memoria. Ho un albero dove ogni nodo ha M figli. Il programma termina con successo se lo faccio girare normalmente ma si inceppa se provo a farlo andare con il Debug di Codeblocks.
Questa è la funzione ricorsiva:

void HTfreeR(link t)
{
int i;
for(i=0; i<M; i++)
{
if(t->next[i]!=NULL)
HTfreeR(t->next[i]);
}

free(t->next);
free(t);

return;
}
E questo è come alloco la radice dell'albero, che è un nodo fittizio, i nodi figli li alloco quasi allo stesso modo:

link HTinit()
{
    int i;
    link testa = malloc(sizeof(link));
    testa->item = NULLitem;
    testa->next = malloc(M*sizeof(link *));
    for(i=0; i<M; i++) testa->next[i] = NULL;
    return testa;
}

7 Risposte

  • Re: Funzione free ricorsiva

    if(t->next[i]!=NULL)
    Che succede quando sei arrivato oltre ad un nodo foglia?
    t->next non esiste perche non esiste t (in quanto NULL)

    Credo che sia questo il problema.
  • Re: Funzione free ricorsiva

    Posta tutto il codice.
  • Re: Funzione free ricorsiva

    Main.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "HT.h"
    
    int main()
    {
        int i;
        char *str="ab", *str2 = "ba";
        link head;
        head = HTinit();
        HTagg(head, str);
        if(cercaRI(head, str2)) printf("Trovata");
        else printf("non trovata");
        HTfreeR(head);
        free(head);
        return 0;
    }
    
    
    HT.h
    
    #include <string.h>
    
    /*#define Item int
    #define eq(A, B) A==B
    #define NULLitem -1*/
    
    #define Item char
    #define eq(A, B) strcmp(A, B)==0
    #define NULLitem 0
    
    typedef struct nodo *link;
    
    struct nodo
    {
        Item item;
        link *next;
    };
    
    int HASH(Item c);
    link HTinit();
    void HTagg(link testa, Item *key);
    int cercaRI(link t, Item *key);
    void HTfreeR(link t);
    
    HT.c
    
    #include "HT.h"
    #define M 27
    int HASH(Item c)
    {
        int h, base = 11;
        h = (base + c)%M;
        return h;
    }
    
    link HTinit()
    {
        int i;
        link testa = malloc(sizeof(link));
        testa->item = NULLitem;
        testa->next = malloc(M*sizeof(link *));
        for(i=0; i<M; i++) testa->next[i] = NULL;
        return testa;
    }
    
    void HTagg(link testa, Item *key)
    {
        int h, i;
        link x;
        link t = testa;
        /*cnverti tutto in minuscolo*/
        for(; (*key)!='\0'; key++)
        {
            h = HASH(*key);
            if(t->next[h]==NULL)
            {
                x=malloc(sizeof(link));
                x->item = (*key);
                x->next = malloc(M*sizeof(link *));
                for(i=0; i<M; i++) x->next[i] = NULL;;
                t->next[h] = x;
            }
            t=t->next[h];
        }
        return;
    }
    
    int cercaRI(link t, Item *key)
    {
        if((*key)=='\0') return 1;
        int h = HASH(*key);
        if(t->next[h]!=NULL)
        if(cercaRI(t->next[h], ++key)) return 1;
        return 0;
    }
    
    
    void HTfreeR(link t)
    {
    int i;
    for(i=0; i<M; i++)
    {
    if(t->next[i]!=NULL)
    HTfreeR(t->next[i]);
    }
    
    free(t->next);
    free(t);
    
    return;
    }
    
    
    Io credo che deallochi più del dovuto.
  • Re: Funzione free ricorsiva

    link testa = malloc(sizeof(link));
    errore!
    link testa = malloc(sizeof(struct nodo));
    trova l'altro e modificalo come ho fatto io.
    Prova e dimmi qualcosa...
  • Re: Funzione free ricorsiva

    Grande è andata. Potresti spiegarmelo? La mia idea iniziale era allocare un vettore di puntatori.

    EDIT: Ok, ho capito l'errore, io creavo un vettore di puntatori, dove ogni singolo puntatore puntava ad un altro puntatore che puntava una struct. Correggimi se sbaglio e scusa il gioco di parole.
  • Re: Funzione free ricorsiva

    link testa = malloc(sizeof(link));
    Cosi tu allochi un puntatore ad una struttura(4byte) mentre nel tuo caso devi allocare lo spazio per la struttura nodo e non un suo puntatore
  • Re: Funzione free ricorsiva

    Grazie mille, sei stato gentilissimo.
Devi accedere o registrarti per scrivere nel forum
7 risposte