структура данных Triee C - PullRequest
       1

структура данных Triee C

0 голосов
/ 01 ноября 2011

хорошо, поэтому я определяю свою структуру следующим образом.

    struct trie {
        struct trie *child[26];
        int count;
        char letter;
    };

проблема в том, что когда я пытаюсь заполнить свой текст словами, я получаю ошибку сегментации. Мне сказали, что проблема в том, что дочерняя переменная не указывает ни на что, и установка их в NULL исправит это. Также создание второй структуры было бы хорошим способом для достижения этой цели. Я новичок в программировании на C и не понимаю, как создать вторую структуру для достижения этой цели. любая помощь будет высоко ценится.

int addWordOccurrence(const char* word)
{

    struct trie *root;
    root = (struct trie *)malloc(sizeof(struct trie*));
    struct trie *initRoot=root;
    int count;

    int x=strlen(word);
    printf("%d",x);
    int i;
    for(i=0; i<x; i++)
    {  
        int z=word[i]-97;
        if(word[i]=='\n')
        {
            z=word[i-1]-97;
            root->child[z]->count++;
            root=initRoot;
        }

        root->child[z] = (struct trie *)malloc(sizeof(struct trie));
        root->child[z]->letter=word[i];
        root->child[z]=root;
    }
    return 0;
}

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Помимо ответа @ MooingDuck, здесь есть еще одна проблема с вашим кодом:

int addWordOccurrence(const char* word)
{

    struct trie *root;
    root = (struct trie *)malloc(sizeof(struct trie*));
    struct trie *initRoot=root;
    int count;
    /* ... */
}

Вы сделали

root = (struct trie *)malloc(sizeof(struct trie*));

, но вы действительно хотите выделить `sizeof (struct trie), а не sizeof указателя (который, вероятно, будет 4 или 8, если вы используете x86 или x86_64).

Это лучше (не нужно явное приведение возврата mallocуказатель в C, и вы можете сделать sizeof так:

struct tree *root = malloc(sizeof(*root));
1 голос
/ 01 ноября 2011
root->child[z] = (struct trie *)malloc(sizeof(struct trie));
root->child[z]->letter=word[i];
root->child[z]=root;

Это проблематично.
1) Что, если child[z] уже был установлен?
2) Вы никогда не устанавливали child[z]->child или child[z]->count на что-либо

# 2вызывая ваши ошибки, # 1 - утечка памяти.

Мое решение было бы написать функцию для выделения новых потомков:

struct trie* newtrie(char newchar) {
    struct trie* r = malloc(sizeof(struct trie));
    memset(r, 0, sizeof(struct trie));
    r->letter = newchar;
    return r;
}

Тогда ваш код станет:

    if (root->child[z] == NULL)
        root->child[z] = newtrie(word[i]);
    root->child[z]=root;

Вы также должны изменить malloc root:

struct trie *root = newtrie(0);

Что более понятно и позволяет избежать ошибок, о которых я упоминал.http://codepad.org/J6oFQJMb Никаких ошибок по умолчанию после 6 или около того вызовов.

Я также заметил, что ваш код malloc sa новый root, но никогда не возвращает его, поэтому никто, кроме этой функции, никогда не сможет увидетьЭто.Это также утечка памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...