2016-04-08 2 views
0

Для назначения мне нужно написать код, который берет строку в качестве входных данных и подсчитывает, какое слово наиболее часто используется в этой строке.Хранение объекта в BinarySearchTree приводит к странным проблемам разыменования

Нам нужно реализовать это, используя двоичное дерево поиска структуры «WordCount», которая содержит массив символов и количество раз, сколько раз появляется слово.

Так определяется структура.

struct wordcount { 
    char word[80]; 
    int count; 
}; 

typedef struct wordcount WordCount; 

Двоичное дерево должно иметь возможность создавать узлы, это код:

BSTnode* createNode(void* item) { 
    BSTnode* newNode = (BSTnode*) malloc(sizeof(BSTnode)); 

    newNode->item = item; 
    newNode->left = NULL; 
    newNode->right = NULL; 

    return newNode; 
} 

Когда я хранить структуру WordCount внутри из двоичного дерева поиска и попытка доступа к элементу, и затем получить доступ к слову, я получаю ошибку сегментации.

Если я просто попытаюсь получить доступ к элементу дерева, я получу массив символов. Это не имеет смысла, потому что я храню структуру wordCount, поэтому мне придется разыгрывать ее дважды.

int main(int argc, char* argv[]) { 
    if (argc >= 1) { 
     WordCount* firstWord = (WordCount*) malloc(sizeof(WordCount)); 
     strcpy(firstWord->word,argv[1]); 
     firstWord->count = 0; 
     BSTnode* BST = createNode(firstWord); 
     printf("%s", BST->item); // should be BST->item->word...but this does not work and says that it cannot find "word" which is apart of 
    } 
    /*int i; 
    char string[80]; 
    for(i = 1; i < argc; i++) { 
     sscanf(argv[i], "%s", string); 
     //printf("%s ", string); 
     //insert(main, argv[i], wordCountCompare); 
    }*/ 
} 

Любая помощь очень ценится. Дайте мне знать, было ли мое объяснение полностью расплывчатым или неполным, или если я полностью игнорирую что-то.

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

Определение BSTnode:

struct bstnode { 
    void *item; 
    struct bstnode *left; 
    struct bstnode *right; 
}; 
typedef struct bstnode BSTnode; 
+0

Is должна быть 'Е ("% s", BST-> item.word)'. –

+1

'item' является указателем. Разве это не BST-> item-> word'? –

+0

говорит, что слово не является исключением структуры или объединения, опять же, что странно, поэтому мне интересно, что я делаю неправильно. – Chris

ответ

1

Ваш элемент должен быть типа WordCount.

struct bstnode { 
    wordcount *item; 
    struct bstnode *left; 
    struct bstnode *right; 
}; 
typedef struct bstnode BSTnode; 

Вы не можете быть разыменования недействительных указателей (которые приводят к ошибке компиляции)

+0

Я решил вопрос после того, как я ушел, но это правильный ответ. Вместо этого я просто использовал ((WordCount *) BST-> item) -> слово вроде этого. Таким образом, если мы хотим создать bstnode int или других типов, мы можем. Определенно должно быть прочитано предупреждения ... – Chris

0

Вы, вероятно, получить эти ошибки, потому что вы пытаетесь разыменовать указатель на NULL. Узнайте, как использовать отладчик !. Подсказка: перерыв в основной и шаг за шагом через функции, чтобы увидеть, где происходит сбой сегментации

+0

Это не ответ, а комментарий. –

+0

@micheal touché. В следующий раз! – mjr

0
printf("%s", BST->item); 

PRINTF в «% s» ожидает строку, и item является структурой. Попробуйте:

printf("%s" BST->item->word); 
Смежные вопросы