Binary εφαρμογή δέντρο στην ερώτηση C όπως διαπιστώθηκε στην K & R

ψήφοι
6

Έτσι έχω διαβάσει μέσω του βιβλίου K & R C και έχουν μια ερώτηση .. στο 6ο κεφάλαιο για Δομές στη σελίδα 140-141, δεν υπάρχει κωδικός που μοιάζει με αυτό (έβγαλα μερικές από τις πιο άσχετο μέρη)

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

Και η σύγχυση μου είναι στο main () λειτουργία στη ρίζα = addNode (ρίζα, λέξη)

Αν addNode επιστρέφει ένα δείκτη στη νέα προσθήκη κόμβου (ή στον κόμβο αυτή η λέξη είναι αν του int που ήδη δέντρο), δεν θα ότι «χάνουν» όλα τα στοιχεία πάνω από το δέντρο; Δεν θα πρέπει να ξεριζώσουμε την παραμονή και την ρίζα του δέντρου;

Ευχαριστώ!

Δημοσιεύθηκε 03/07/2011 στις 08:25
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
3

Παρεξήγηση σας είναι στη συμπεριφορά της addNode. Κάνει Δεν επιστρέφει ένα δείκτη στο προστέθηκαν πρόσφατα κόμβο? Αντίθετα, επιστρέφει ένα δείκτη στον κόμβο που ψηφίστηκε το, p(εκτός αν αυτό ήταν NULL).

Από την μόνη φορά που root == NULLείναι όταν προστίθεται η πρώτη λέξη, rootθα έχουν την ίδια αξία από εκείνο το σημείο, και να ανατεθεί αυτή την ίδια αξία ξανά και ξανά. Αυτό είναι απλά ένα κομψό τρόπο για την αντιμετώπιση των κενών δέντρα, τα οποία εκπροσωπούνται από το NULLδείκτη.

Να θυμάστε ότι κάθε αναδρομική κλήση της addNodeέχει διαφορετική αξία για p, όμως. Αυτό είναι το πώς λειτουργούν οι τοπικές μεταβλητές? που είναι τοπικά σε μια συγκεκριμένη επίκληση της λειτουργίας, για να μην τη λειτουργία στο σύνολό της. Ίσως αυτό να οδηγήσει σε παρανόηση σας συμπεριφορά της συνάρτησης.

Απαντήθηκε 03/07/2011 στις 08:38
πηγή χρήστη

ψήφοι
5

rootπάντα μένουν ως ρίζα του δέντρου. rootέχει περάσει ως η πρώτη παράμετρος addNodeτης οποίας θα είναι μόνο mallocαν αυτό είναι NULL, δηλαδή όταν rootέχει περάσει για πρώτη φορά. Στη συνέχεια καλεί δεν θα αλλάξει root, θα τροποποιήσει μόνο count, leftή right. Σημειώστε ότι σε αναδρομικές addNodeκλήσεις pδεν έχει περάσει, αλλά μάλλον έχει απομείνει ή μεταβιβάζεται το δικαίωμα του παιδιού. Προσπαθήστε να περάσουν από το δέντρο με χαρτί και μολύβι / στυλό και θα συνειδητοποιήσετε πόσο παίρνουν προστίθενται οι κόμβοι.

Απαντήθηκε 03/07/2011 στις 08:39
πηγή χρήστη

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