Binaire boom implementatie in C vraag gevonden in K & R

stemmen
6

Dus ik heb het lezen via de K & R C boek en heb een vraag .. in de 6e hoofdstuk over de structuren op pagina 140-141, is er code die er zo uitziet (ik nam een ​​aantal van de meer irrelevante delen)

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

En mijn verwarring is in de main () functie bij root = AddNode (root, woord)

Als AddNode een pointer naar de nieuw toegevoegde knooppunt (of naar het knooppunt dat woord is als het al int hij boom), zou dat niet verliezen alle gegevens boven de boom? Moet blijven als de wortel van de boom niet te roeien?

Bedankt!

De vraag is gesteld op 03/07/2011 om 08:25
bron van user
In andere talen...                            


2 antwoorden

stemmen
3

Uw misverstand is in het gedrag van addNode. Het maakt niet een pointer naar de nieuw toegevoegde knooppunt terug; eerder retourneert een verwijzing naar het knooppunt dat geleid is in het, p(behalve dat was NULL).

Aangezien de enige keer dat root == NULLis wanneer de allereerste woord wordt toegevoegd, rootzal dezelfde waarde vanaf dat moment hebben, en krijgen deze zelfde waarde over en weer toegewezen. Dit is slechts een elegante manier van omgaan met lege bomen, die worden vertegenwoordigd door de NULLaanwijzer.

Onthoud dat elke recursieve aanroep van addNodeeen andere waarde voor p, dat wel. Dit is hoe lokale variabelen werken; ze lokaal op een specifieke aanroep van de functie, niet de functie als geheel. Misschien heeft dit geleid tot uw misverstand van het gedrag van de functie.

antwoordde op 03/07/2011 om 08:38
bron van user

stemmen
5

rootwordt altijd blijven als wortel van de boom. rootwordt doorgegeven als de eerste parameter addNodedie zal alleen mallocals dat NULL, dat wil zeggen wanneer rootwordt gevoerd voor het eerst. In latere noemt het zal niet veranderen root, zal alleen te wijzigen count, leftof right. Merk op dat in recursieve addNodeoproepen pwordt niet doorgegeven, in plaats van dat het naar links of rechts kind wordt doorgegeven. Probeer om te gaan door middel van de boom met een papier en potlood / pen en je zult beseffen hoe de knooppunten worden steeds toegevoegd.

antwoordde op 03/07/2011 om 08:39
bron van user

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