Question

Je suis en train de mettre en œuvre le code de Huffman adaptatif, mais en essayant de construire l'arbre que je reçois une erreur de segmentation lors de l'exécution du code à la ligne « currentNYT-> LCHILD = newNYT; » en fonction de addnode ().

Quelqu'un pourrait-il s'il vous plaît me aider? Il pourrait être quelque chose de simple, je ne suis pas au courant. ne pas utiliser C pendant un certain temps 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
Était-ce utile?

La solution

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

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

Probablement voulez

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

au lieu

Autres conseils

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.

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

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

root = currentNYT;

au lieu?

Vous pouvez initialiser aussi les éléments de ce nœud. 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;

Oui enlever currentNYT = racine me débarrasser de la segfault mais malheureusement, il ne fera pas ce que je veux.

Je veux initialiser mon arbre. La racine est vide avec les enfants NULL. currentNYT sera d'abord pointer vers la racine.

addNode () toujours ajouter deux nouveaux nœuds enfants au nœud currentNYT. L'enfant gauche sera le newNYT et le noeud droit sera le nœud qui a la valeur envoyée comme argument de la fonction. Le prochain appel de addNode () fera la même chose, mais les deux nouveaux parent de nœuds sera le newNYT donc currentNYT doit pointer vers newNYT après le premier appel de addNode ().

currentNYT pointera toujours vers le nœud qui servira de parent sur le prochain appel de addNode ().

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top