Binární strom realizace v jazyce C otázku, jak bylo zjištěno v K & R

hlasů
6

Tak jsem pročítal knihy K & R C a ještě otázka .. v 6. kapitole o structs na straně 140-141, je zde kód, který vypadá následovně (Vzal jsem si některé z více nepodstatných částí)

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

A můj zmatek je v main () funkce na root = AddNode (root, word)

Pokud AddNode vrátí ukazatel na nově přidaného uzlu (nebo uzlu, který slovo je-li již jeho he pravý strom), nebylo by to „ztratí“ všechny údaje uvedené na stromě? By neměla kořen pobyt jako kořen stromu?

Dík!

Položena 03/07/2011 v 08:25
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
3

Váš nedorozumění je v chování addNode. To není vrátí ukazatel na nově přidaného uzlu; spíše, vrátí ukazatel na uzel, který byl podán v, p(není-li, který byl NULL).

Vzhledem k tomu, jediný čas, který root == NULLje při přidání první slovo, rootbudou mít stejnou hodnotu od té chvíle, a dostat přidělen tento velmi stejnou hodnotu znovu a znovu. To je jen elegantní způsob, jak se vypořádat s prázdnými stromy, které jsou reprezentované NULLukazatelem.

Uvědomte si, že každá rekurzivní volání addNodejinou hodnotu p, ačkoli. To je, jak lokální proměnné fungují; jsou místní konkrétního vyvolání funkce, nikoli funkce jako celek. Možná, že to vedlo k vaší nedorozumění chování Funkce je.

Odpovězeno 03/07/2011 v 08:38
zdroj uživatelem

hlasů
5

rootvždy zůstat jako kořen stromu. rootje předán jako první parametr addNode, který bude pouze mallocv případě, že je NULL, tedy, když rootje předán poprvé. Později zavolá, že se nezmění root, bude jen změnit count, leftnebo right. Všimněte si, že v rekurzivní addNodevolání pneprojde, spíše je to vlevo nebo vpravo dítě je předán. Pokusit se projít strom s papírem a tužkou / pero a budete si uvědomit, jak se dostat z přidané uzly.

Odpovězeno 03/07/2011 v 08:39
zdroj uživatelem

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