implementare arbore binar în C întrebare așa cum se găsește în K & R

voturi
6

Așa că am citit prin carte K & R C și au o întrebare .. în al 6-lea la capitolul structs la pagina 140-141, există un cod care arata ca acest lucru (am luat unele dintre părțile mai irelevante)

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

Și confuzia mea este în funcția principală () la rădăcină = addNode (rădăcină, cuvânt)

Dacă addNode returnează un pointer la nodul nou adăugat (sau la nodul care cuvântul este în cazul în care sa int deja el copac), nu ar că „pierde“ toate datele de mai sus copac? Nu ar trebui să rădăcină ședere ca rădăcină de copac?

Mulțumiri!

Întrebat 03/07/2011 la 08:25
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
3

Neînțelegere dvs. este în comportamentul addNode. Aceasta nu nu returnează un pointer la nodul nou adăugat; mai degrabă, se returnează un pointer la nodul care a fost trecut în, p( cu excepția cazului în care a fost NULL).

Având în vedere că singura dată când root == NULLeste atunci când se adaugă primul cuvânt, rootva avea aceeași valoare din acel moment, si sa atribuit acest aceeași valoare de peste si peste din nou. Acesta este doar un mod elegant de a face cu copaci goale, care sunt reprezentate de NULLindicatorul.

Rețineți că fiecare apel recursiv de addNodeare o altă valoare pentru p, totuși. Acesta este modul în care funcționează variabilele locale; acestea sunt locale pentru o anumită invocare a funcției, nu la funcția ca un întreg. Poate că acest lucru a dus la neînțelegere dvs. de comportamentul functiei.

Publicat 03/07/2011 la 08:38
sursa de către utilizator

voturi
5

rooteste întotdeauna stau ca rădăcină a arborelui. rooteste trecut ca primul parametru al addNodecare va numai în malloccazul în care este NULL, adică atunci când rooteste trecut pentru prima dată. În mai târziu , solicită aceasta nu se va schimba root, se va modifica numai count, leftsau right. Rețineți că , în recursive addNodeapelurilor pnu este trecut, mai degrabă este la stânga sau la dreapta copil este trecut. Încearcă să treacă prin copac cu o hârtie și creion / stilou și vă va da seama cum să fie adăugate nodurile.

Publicat 03/07/2011 la 08:39
sursa de către utilizator

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