Binärbaum Implementierung in C Frage, wie in K & R gefunden

stimmen
6

Also habe ich durch das K & R C Buch gelesen und habe eine Frage .. im 6. Kapitel auf structs auf Seite 140-141, gibt es Code, der wie folgt aussieht (habe ich einige der irrelevanten Teile aus)

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

Und meine Verwirrung ist in der main () Funktion bei root = addNode (root, word)

Wenn addNode einen Zeiger auf den neu hinzugefügten Knoten zurückgibt (oder an den Knoten dieses Wort ist, wenn seine bereits er Baum int), würde das nicht „verlieren“ alle Daten über dem Baum? Sollte nicht Aufenthalt als die Wurzel des Baumes Wurzel?

Vielen Dank!

Veröffentlicht am 03/07/2011 um 08:25
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
3

Ihr Missverständnis ist im Verhalten addNode. Es ist nicht ein Zeiger auf den neu hinzugefügten Knoten zurückzukehren; Vielmehr gibt es einen Zeiger auf den Knoten, der in, übergeben wurde p(es sei denn , das war NULL).

Da das einzige Mal , dass , root == NULLwenn das erste Wort hinzugefügt wird , rootwird den gleichen Wert von diesem Punkt an, und diese über sehr gleichen Wert zugewiesen bekommen und immer wieder. Dies ist nur eine elegante Art und Weise mit leeren Bäume handelt, die durch die vertreten sind NULLZeiger.

Denken Sie daran , dass jeder rekursive Aufruf addNodeeinen hat unterschiedlichen Wert für p, though. Dies ist , wie lokale Variablen arbeiten; sie sind lokal für einen bestimmten Aufruf der Funktion, nicht auf die Funktion als Ganzes. Vielleicht führte dies zu Ihrem Missverständnis über das Verhalten der Funktion.

Beantwortet am 03/07/2011 um 08:38
quelle vom benutzer

stimmen
5

rootbleibt immer als Wurzel des Baumes. rootwird als erster Parameter übergibt addNodedie erst , mallocwenn das ist NULL, das heißt , wenn rootzum ersten Mal übergeben wird. In späterer anruft , wird es nicht ändern root, ändern Sie nur count, leftoder right. Beachten Sie, dass in rekursiven addNodeAnrufe pwerden nicht weitergegeben, sondern ist es nach links oder rechts Kind weitergegeben wird. Versuchen Sie, durch den Baum zu gehen mit einem Bleistift und Papier / Stift und Sie werden erkennen , wie die Knoten hinzugefügt zu werden .

Beantwortet am 03/07/2011 um 08:39
quelle vom benutzer

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