Binærtreet implementering i C spørsmålet som finnes i K & R

stemmer
6

Så jeg har lest gjennom K & R C bok og har et spørsmål .. i sjette kapittel på structs på side 140-141, er det kode som ser slik ut (jeg tok ut noen av de mer irrelevante deler)

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

Og min forvirring er i main () -funksjonen på root = ADDNODE (root, ord)

Hvis Addnode returnerer en peker til den nylig lagt node (eller til noden som ordet er på hvis det allerede int han tre), ville ikke det miste alle data over treet? Bør ikke rot opphold som roten av treet?

Takk!

Publisert på 03/07/2011 klokken 07:25
kilden bruker
På andre språk...                            


2 svar

stemmer
3

Din misforståelse er i oppførselen addNode. Det trenger ikke returnere en peker til den nylig lagt node; heller, returnerer den en peker til den noden som ble ført inn, p(med mindre det var NULL).

Siden den eneste gangen root == NULLer da den aller første ordet er lagt til, rootvil ha samme verdi fra det punktet på, og får tildelt denne samme verdi om og om igjen. Dette er bare en elegant måte å håndtere tomme trær, som er representert ved den NULLpekeren.

Husk at hver rekursive kall addNodehar en annen verdi for p, skjønt. Dette er hvordan lokale variabler jobb; de er lokale for en bestemt påkalling av funksjonen, ikke til funksjonen som helhet. Kanskje dette førte til misforståelse av funksjonens oppførsel.

Svarte 03/07/2011 kl. 07:38
kilden bruker

stemmer
5

rooter alltid bor som roten av treet. rootføres som den første parameteren addNodesom vil bare mallochvis det er NULL, dvs. når rootføres for første gang. I senere kaller det vil ikke endre root, vil bare endre count, lefteller right. Merk at i rekursive addNodesamtaler pikke er passert, heller det mot venstre eller høyre barnet er passert. Prøv å gå gjennom treet med et papir og blyant / penn, og du vil innse hvor nodene får lagt.

Svarte 03/07/2011 kl. 07:39
kilden bruker

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