Изменение потомков структуры C с помощью функции (для применения дерева) - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь создать три в C, загрузить словарь в три, прямо сейчас, но у меня возникают проблемы с изменением структуры.

У меня есть функция, которая создает пустой узел, прямо сейчас, и это, кажется, работает нормально.Основная функция просматривает файл словаря и вызывает функцию «вставки» следующим образом:

while (ftell(inptr) < endIndex)
{
    fscanf(inptr,"%[^\n]", word);
    printf("%s\n", word);

    //main insert function
    insert(word, root);


    //skips past this word
    fseek(inptr, 1, SEEK_CUR);
}

Это сразу же выполняется тестом, в котором я пытаюсь определить значение логического значения в "Значение "trie".

printf("%i\n", (int)(root -> ptr[0] -> isEnd));

Но это приводит к ошибке, потому что указатель корня, по-видимому, нулевой (доступ к элементу внутри нулевого указателя типа 'struct node').

Реализацияфункции insert выглядит следующим образом.

bool insert(char *word, struct node *root)
{
    if (strcmp(word, "") == 0)
    {
        for (int i = 0, size = 27; i < size; i++)
        {
            root -> ptr[i] = NULL;
        }
        root -> isEnd = true;
        return false;
    }
    else
    {
        //gets the first letter of the word
        char firstLetter = word[0];

        //figures out which place in the array it goes
        int firstLetterInt;
        if (isalpha(firstLetter))
        {
            firstLetterInt = firstLetter - 'a';
        }
        else
        {
            firstLetterInt = 26;
        }

        //gets the rest of the word
        char *subbuff = calloc(45,1);;
        memcpy(subbuff, &word[1], strlen(word) - 1);
        subbuff[strlen(word)] = '\0';

        if(!(root -> ptr[firstLetterInt]))
        {
            root -> ptr[firstLetterInt] = blankNode();
        }

        insert(subbuff, root -> ptr[firstLetterInt]);
        free(subbuff);
        return true;
    }
}

Я понимаю, что должен использовать указатели и тому подобное, но я поиграл с этим и не могу заставить его работать,Я даже пытался передать узлы как struct node **root, но, похоже, появилась та же проблема.Другая странная вещь заключается в том, что во время цикла while они, кажется, распознают вставки, потому что, когда вставляется «caterpillar», «c», «a» и «t» не создаются как новые узлы.

1 Ответ

0 голосов
/ 26 декабря 2018

, если вы не инициализируете структуру* так root есть и будет вечно null,
Вот демонстрационный код, показывающий, как назначить структурные поля в функции

#include <stdio.h>
/***struct defenition***/
typedef struct demo_t
{
    int foo;
    int bar;
}demo_t;
/***Function to change values***/
void insert(demo_t *demo)
{
    demo->foo = 1;
    demo->bar = 2;
}
/***main***/
int main()
{
    //create instance of struct
    demo_t demo;
    demo.foo = 0;
    demo.bar = 0;
    //pass the reference
    insert(&demo);
    //verify
    printf("foo = %d    bar = %d\r\n", demo.foo, demo.bar);

    return 0;
}
...