2009-11-17 3 views
0

J'essaye d'implémenter le code adaptatif de huffman, mais en essayant de construire l'arbre j'obtiens une erreur de segmentation en exécutant le code à la ligne "currentNYT-> lchild = newNYT;" dans la fonction addnode().Faute de segmentation - Arbre Huffman adaptatif

Quelqu'un peut-il m'aider s'il vous plaît? Ce pourrait être quelque chose de simple dont je ne suis pas conscient. N'a pas utilisé C pendant un moment maintenant.

//variable and type declarations 

struct treeElement { 
    unsigned long weight; 
    unsigned short id; 
    char chr; 
    struct treeElement *lchild, *rchild, *parent; 
}; 

typedef struct treeElement node; 

node *root, *currentNYT; 

//functions 

void initTree() { 
    root = NULL; 
    currentNYT = malloc(sizeof(node)); 
    currentNYT = root; 
} //initTree 

void addNode(char newNodeChr) { 
    node *newNYT, *newExternal; 
    newNYT = malloc(sizeof(node)); 
    newNYT->id=maxNodes-idCount; idCount++; 
    newNYT->chr='\0'; 
    newNYT->weight=0; 
    newNYT->parent=currentNYT; 
    newNYT->lchild=newNYT->rchild=NULL; 
    newExternal = malloc(sizeof(node)); 
    newExternal->id=maxNodes-idCount; 
    newExternal->chr=newNodeChr; 
    newExternal->weight=1; 
    newExternal->parent=currentNYT; 
    newExternal->lchild=newExternal->rchild=NULL; 
    currentNYT->lchild = newNYT; 
    currentNYT->rchild = newExternal; 
    currentNYT=newNYT; 
} //addNode 

Répondre

0

Ce qui suit semble être une première erreur ...

currentNYT = malloc(sizeof(node)); 
currentNYT = root; 

veulent probablement

root = malloc(sizeof(node)); 
currentNYT = root; 

au lieu

0
root = NULL; 
currentNYT = malloc(sizeof(node)); 
currentNYT = root; 

Um, vous configurez currentNYT NULL. Vouliez-vous dire:

root = currentNYT; 

à la place?

Vous pouvez également initialiser les éléments de ce noeud. Oh, et peut-être vérifier que malloc a réussi?

peut être plus clair à faire

root = malloc(sizeof(node)); 
if (!root) { 
    /* panic! */ 
} 
root->.... = whatever; /* for each of the elements of the struct */ 
currentNYT = root; 
0

Regardez ceci:

root = NULL; 
currentNYT = malloc(sizeof(node)); 
currentNYT = root; 

Vous définissez root-NULL, vous définissez currentNYT à root. Par conséquent currentNYT est toujours NULL.

0

Oui currentNYT = racine retirer me débarrasser de la segfault mais malheureusement ça ne fera pas ce que je veux.

Je veux initialiser mon arbre. La racine sera vide avec les enfants NULL. currentNYT pointera initialement vers root. AddNode() ajoutera toujours deux nouveaux nœuds enfants au nœud currentNYT. L'enfant de gauche sera le newNYT et le noeud de droite sera le noeud ayant la valeur envoyée comme argument de la fonction. L'appel suivant de addNode() fera la même chose mais le parent de deux nouveaux nœuds sera le newNYT, donc currentNYT doit pointer vers newNYT après le premier appel de addNode(). CurrentNYT pointera toujours vers le noeud qui servira de parent lors de l'appel suivant de addNode().

J'espère vraiment que quelqu'un peut vous aider.

+0

Vous avez probablement intérêt à le republier comme nouvelle question. – caf

Questions connexes