2016-10-29 1 views
0

J'ai donc trouvé quelques exemples d'arbres en ligne et je les ai dégotés pour les essayer pour aider un jeu dans lequel je travaillerai qui contiendra un arbre de tous les mots du dictionnaire. L'exemple que j'ai trouvé en ligne n'a pas eu de mise en œuvre d'un freeTree pour éviter les fuites de mémoire, donc j'essaie de faire mon propre. Cependant, je n'ai pas travaillé avec c depuis un moment et je rencontre des problèmes.Libérer un trie tree

char keys[][8] = {"the", "a", "there", "answer", "any", 
       "by", "bye", "their"}; 
char output[][32] = {"Not present in trie", "Present in trie"}; 
struct TrieNode *root = getNode(); 

// Construct trie 
int i; 
for (i = 0; i < ARRAY_SIZE(keys); i++){ 
    insert(root, keys[i]); 
} 

// Search for different keys 
printf("%s --- %s\n", "the", output[search(root, "the")]); 
printf("%s --- %s\n", "these", output[search(root, "these")]); 
printf("%s --- %s\n", "their", output[search(root, "their")]); 
printf("%s --- %s\n", "thaw", output[search(root, "thaw")]); 

freeTree(root); 

printf("test after free\n"); 
printf("%s --- %s\n", "the", output[search(root, "the")]); 
printf("%s --- %s\n", "these", output[search(root, "these")]); 
printf("%s --- %s\n", "their", output[search(root, "their")]); 
printf("%s --- %s\n", "thaw", output[search(root, "thaw")]); 

ceci est un test im simple fonctionnement et les résultats après la libre sont les mêmes qu'avant

the --- Present in trie 
these --- Not present in trie 
their --- Present in trie 
thaw --- Not present in trie 
test after free 
the --- Present in trie 
these --- Not present in trie 
their --- Present in trie 
thaw --- Not present in trie 

est ici la structure im en utilisant

struct TrieNode 
{ 
    struct TrieNode *children[ALPHABET_SIZE]; 
    bool isLeaf; 
}; 

et la mise en œuvre sans

void freeChildren(struct TrieNode *node){ 
    int i; 
    if (node->isLeaf == false){ 
     for (i=0;i<ALPHABET_SIZE;i++){ 
     if (node->children[i] != NULL){ 
      freeChildren(node->children[i]); 
     } 
     } 
    } 

    if (node != NULL){ 
     node = NULL; 
     free(node); 
    } 
} 

void freeTree(struct TrieNode *root){ 
    freeChildren(root); 
    free(root); 
} 

WH fr je crée un nouveau nœud de l'arbre, j'ai la mémoire pour cela, donc je sais que j'ai besoin de libérer.

Répondre

1
void freeChildren(struct TrieNode *node){ 
    int i; 
    if (node != NULL && node->isLeaf == false){//NULL check important only for the root 
     for (i=0;i<ALPHABET_SIZE;i++){ 
     if (node->children[i] != NULL){ 
      freeChildren(node->children[i]); 
      node->children[i] = NULL]; //you have to remove the address, otherwise it stays, just is no longer allocated (but it is still possible to access it, though it might crash or do whatever else) 
     } 
     } 
    } 

    if (node != NULL){ //again only root could be NULL 
     free(node);//this has to go first 
     //node = NULL; this has no meaning, as this is the local variable, not the place you passed it to 
    } 
} 

void freeTree(struct TrieNode *root){ 
    freeChildren(root); 
    // free(root); this is already done in the freeChildren 
    // you might want to realloc the root there though, as otherwise you don't have anything allocated to root 
    root = NULL; 
} 
+0

Merci pour la réponse fonctionne maintenant! Les commentaires étaient très clairs et informatifs merci! – user3267256

2

Je pense que votre problème est cette partie:

if (node != NULL){ 
    node = NULL; 
    free(node); 
} 

Eh bien, vous devez libérer rétablissez alors NULL. Sinon, vous perdez déjà l'adresse de toute façon.