2016-04-08 8 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構造を保存し、項目にアクセスしようとすると、その単語にアクセスすると、Segmentation Faultが発生します。

ツリーの項目にアクセスしようとすると、charの単語配列が取得されます。これは意味がありません。なぜなら、私はwordCount構造体を格納しているので、2回逆参照する必要があります。

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

(コンパイルエラーにつながる)、ボイドポインタを逆参照することができないが、 'printfの( "%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) - > wordのようなものでした。そうすれば、int型やその他の型のbstnodeを作成したい場合は可能です。 間違いなく警告を読む必要があります... – Chris

0

あなたはNULLポインタデリファレンスしようとしているので、あなたはおそらく、これらのエラーを取得しています。デバッガの使い方を学んでください。ヒント:メインの切れ目とセグメンテーションフォールトが

+0

これは答えではなく、コメントです。 –

+0

@michealtouché。次回! – mjr

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

のprintfの「%s」は文字列を期待し、itemが構造体である発生場所を確認するための関数スルーステップ。試してみてください:

printf("%s" BST->item->word); 
関連する問題