la mise en œuvre de l'arbre binaire en question C que l'on trouve dans K & R

voix
6

J'ai donc lu le livre K & R C et ont une question .. dans le chapitre 6 sur struct à la page 140-141, il y a un code qui ressemble à ceci (j'ai pris quelques-unes des parties les plus pertinentes)

/*
the program loops through a tree looking for some word
if it finds the word itll incremenet the count by 1 
if it doesnt itll add a new node
*/

 struct node {
    char *word;
    int count;
    struct node *left;
    struct node *right;
}

 main() {
    struct node *root;
    char word[1000];

    root = NULL;
    while(getword(word, MAXWORD) != EOF) /* getword just grabs 1 word at a time from a file of words */
        if(isalpha(word[0])) /* isalpha checks to see if it is a valid word */
            root = addNode(root, word);

    treeprint(root); /* prints the tree */
    return 0;
}

struct node *addNode(struct node *p, char *w) {
    int cond;

    if(p == NULL) {
        p = malloc(sizeof(struct node)); /* allocates memory for the new node */
        p -> word = strdup(w);
        p -> count = 1;
        p -> left = p -> right = NULL;
    }

    else if ((cond = strcmp(w, p -> word)) == 0)
        p -> count++;

    else if(cond < 0)
        p -> left = addNode(p -> left, w);

    else
        p -> right = addNode(p -> right, w);

    return p;
}

Et ma confusion est dans la fonction principale () à la racine = addNode (racine, mot)

Si addNode renvoie un pointeur sur le nœud nouvellement ajouté (ou au nœud ce mot est à si son arbre il déjà int), ne serait pas que « perdre » toutes les données ci-dessus l'arbre? Ne devrait pas racine séjour comme la racine de l'arbre?

Merci!

Créé 03/07/2011 à 08:25
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
3

Votre incompréhension est dans le comportement addNode. Il ne pas retourner un pointeur vers le noeud nouvellement ajouté; au contraire, elle renvoie un pointeur vers le noeud qui a été transmis, p( à moins que ce fut NULL).

Étant donné que la seule fois que root == NULLc'est quand le premier mot est ajouté, rootaura la même valeur à partir de ce moment, et obtenir attribué cette même valeur , encore et encore. Ceci est juste une façon élégante de traiter avec des arbres vides, qui sont représentés par le NULLpointeur.

Rappelez - vous que chaque appel récursif addNodea une autre valeur p, cependant. Ce travail est de savoir comment les variables locales; ils correspondent à une invocation particulière de la fonction, et non à la fonction dans son ensemble. Peut - être que cela a conduit à votre incompréhension du comportement de la fonction.

Créé 03/07/2011 à 08:38
source utilisateur

voix
5

rootest toujours rester comme racine de l'arbre. rootest passé comme premier paramètre addNodequi ne sera mallocsi c'est NULL, à savoir quand rootest passé pour la première fois. Plus tard , appelle cela ne changera pas root, ne fera que modifier count, leftou right. Notez que dans récursives addNodeappels pne sont pas transmises, c'est plutôt à gauche ou à droite enfant est passé. Essayez de passer par l'arbre avec un papier et un crayon / stylo et vous vous rendrez compte comment les nœuds sont ajoutés se.

Créé 03/07/2011 à 08:39
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more