implementazione albero binario in C domanda come si trova in K & R

voti
6

Così ho letto il libro K & R C e hanno una domanda .. nel 6 ° capitolo sulla struct a pagina 140-141, v'è il codice che assomiglia a questo (ho preso alcune delle parti più irrilevanti)

/*
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;
}

E la mia confusione è nella funzione main () alla radice = addNode (root, word)

Se addNode restituisce un puntatore al nodo appena aggiunto (o al nodo di quella parola è al se già int egli albero), non avrebbe che perdere tutti i dati di cui sopra l'albero? Non dovrebbe sradicare soggiorno come la radice di un albero?

Grazie!

È pubblicato 03/07/2011 alle 08:25
fonte dall'utente
In altre lingue...                            


2 risposte

voti
3

Il tuo fraintendimento è nel comportamento di addNode. Esso non restituisce un puntatore al nodo appena aggiunto; piuttosto, restituisce un puntatore al nodo che è stato passato a, p(a meno che era NULL).

Dal momento che l'unica volta che root == NULLsi ha quando si aggiunge la prima parola, rootavrà lo stesso valore da quel punto in poi, e ottenere assegnato questo stesso valore più e più volte. Questo è solo un modo elegante di trattare con alberi vuoti, che sono rappresentati dal NULLpuntatore.

Ricordate che ogni chiamata ricorsiva di addNodeha un diverso valore per i p, però. Questo è come funzionano le variabili locali; essi sono locali ad una particolare chiamata della funzione, non alla funzione nel suo complesso. Forse questo ha portato al tuo fraintendimento del comportamento della funzione.

Risposto il 03/07/2011 a 08:38
fonte dall'utente

voti
5

rootè sempre rimanendo come radice dell'albero. rootviene passato come primo parametro addNodedi cui solo mallocse è NULL, cioè quando rootviene passato per la prima volta. In seguito lo chiama non cambierà root, sarà solo modificare count, lefto right. Si noti che in ricorsive addNodechiamate pnon è passato, anzi è lasciato o figlio destro è passato. Provate a passare attraverso l'albero con una carta e matita / penna e vi renderete conto di come sono sempre aggiunti i nodi.

Risposto il 03/07/2011 a 08:39
fonte dall'utente

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