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

И моя путаница в основной функции () в корне = AddNode (корень слова)

Если AddNode возвращает указатель на вновь добавленный узел (или узел, который слово в случае его уже ИНТА ситемы дерева), было бы не то, что «потерять» все данные выше дерева? Не следует искоренять пребывание в качестве корня дерева?

Благодаря!

Задан 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