Bináris fa megvalósítása C kérdéses találhatók K & R

szavazat
6

Így olvastam át a K & R C könyvet, és egy kérdés .. a 6. fejezetben a struktúrákat oldalon 140-141, van kód, amely úgy néz ki, mint ez (Kivettem néhány, a releváns részeit)

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

És az én zavart a main () függvény root = addNode (gyökér, word)

Ha addNode visszaad egy pointert az újonnan hozzáadott csomópont (vagy annak a csomópontnak a szó van, ha már int ő fa), nem akarták, hogy „elveszti” a fenti adatok a fa? Amennyiben nem gyökér tartózkodása a gyökér a fa?

Kösz!

A kérdést 03/07/2011 08:25
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
3

A félreértés van a viselkedése addNode. Ez nem nem tér vissza a mutatót az újonnan hozzáadott csomópont; Inkább azt visszaad egy pointert a csomópontnak, amely fogadtak el, p(kivéve, ha volt NULL).

Mivel az egyetlen alkalom, hogy root == NULLamikor az első szót adunk hozzá, rootmajd ugyanazt az értéket attól a ponttól, és kap hozzá ezt a nagyon ugyanazt az értéket újra és újra. Ez csak egy elegáns módon foglalkozik az üres fák, amelyek képviselik a NULLmutatót.

Ne feledje, hogy minden rekurzív hívást addNodeegy másik érték p, mégis. Így a helyi változókat működik; azok helyi és egy adott könyörgése a funkció, nem pedig a funkciója, mint az egész. Lehet, hogy ez vezetett a félreértés a függvény viselkedését.

Válaszolt 03/07/2011 08:38
a forrás felhasználó

szavazat
5

rootmindig marad a gyökér a fa. rootvezetjük, mint az első paraméter addNode, amely csak akkor malloc, ha ez NULL, vagyis ha rootvezetünk az első alkalommal. A későbbi hívások nem fog változni root, csak módosítani count, leftvagy right. Megjegyezzük, hogy a rekurzív addNodehívások pnem telt el, hanem ez balra vagy jobbra gyermek jut. Megpróbál átmenni a fa egy papír és ceruza / toll és rá fogsz jönni, hogy a csomópontok egyre hozzá.

Válaszolt 03/07/2011 08:39
a forrás felhasználó

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