2016-07-27 11 views
1

私はC言語を新しくしており、現在スペルチェッカーを書いています。これを行うために、私は最初に簡単な参照のためにハッシュテーブルに単語の辞書をロードしています。ここに私のコードは次のとおりです。C:リンクされたリストのハッシュテーブルの人口問題

bool load(const char* dictionary) 
{ 
    typedef struct node 
    { 
     char word[LENGTH + 1]; 
     struct node* next; 
    } 
    node; 

    node* table[500]; 

    FILE *fp; 
    fp = fopen("dictionaries/small", "r"); 

    if(fp == NULL) 
    { 
     return 0; 
    } 

    node* new_node = malloc(sizeof(node)); 
    fscanf(fp, "%s", new_node->word); 
    int hashed_word = hash_function(new_node->word); 

    if(table[hashed_word] == NULL) //if the table has no value at the index 
    { 
     table[hashed_word]->word = new_node->word; //Issue here 
    } 
    return 0; 
} 

このコードは非常に単純にファイルの最初の行(ワード)を読み込み、(最初の単語「猫」の2のハッシュを与える)、それをハッシュします。私はそれから、テーブルがハッシュ関数が与えるインデックスに単語がないことを確認します。

最初のリンク( 'cat')の最初のリンクでリンクリストを開始したいのですが、そこからビルドします。私はこのコードを実行するときしかし、私はここでの問題を得る:

table[hashed_word]->word = new_node->word; //Issue here 

と、このエラーが発生します。

dictionary.c:66:34: error: array type 'char [46]' is not assignable 
    table[hashed_word]->word = new_node->word; 
    ~~~~~~~~~~~~~~~~~~~~~~~~^
1 error generated. 

私は(この行は「猫」であると「単語」テーブルの一部を割り当てることだろうと思いましたnew_nodeの単語部分)はありません。

誰かが間違っていることを教えていただけますか?私はポインターが混乱しているので、それが非常に基本的だと思います!私は数日間このことに固執していて、少し落胆し始めているので、提供される可能性のあるヘルプが大好きです。

+1

まあ...配列型に割り当てることはできません。おそらく 'memcpy'や' strcpy'(あるいはその安全なバリエーション)が必要でしょう。 –

+0

私は以前のようなものを試してみましたが、セグメンテーション違反があったので間違ったトラックにいると思いました – user1636588

+0

'table [hashed_word] == word'は' table [hashed_word] - > word'が 'NULL-> * table [500]; 'は初期化されていません) – BLUEPIXY

答えて

2

あなたは500個のポインタのテーブルを作成していますが、それは何にも初期化していません。次に、要素をチェックして要素がnullであるかどうかを確認します。要素がnullであるかどうかは、ごみだけです。

単語を追加しようとすると、新しく割り当てられたノードをテーブルにリンクするのではなく、すでにテーブルにあるノードに書き込もうとします。

テーブルもローカル変数であるため、load関数が返された後はアクセスできなくなります。

上記のすべてのための最も簡単な修正は、テーブルとstruct node定義はグローバルにすることです:

typedef struct node 
{ 
    char word[LENGTH + 1]; 
    struct node* next; 
} node; 

node *table[500] = { 0 }; 

をしてから、テーブルを埋めるためにループを使用します。

bool load(const char* dictionary) 
{ 
    char word[256]; 
    FILE *fp = fopen("dictionaries/small", "r"); 
    if(fp == NULL) 
     return false; 

    while (fscanf(fp, "%255s", word) == 1) { 
     if (strlen(word) > LENGTH) 
      continue; // ignore words that are too long 
     int hashed_word = hash_function(word); 
     node* new_node = malloc(sizeof(node)); 
     strcpy(new_node->word, word); 
     new_node->next = table[hashed_word]; 
     table[hashed_word] = new_node; 
    } 
    fclose(fp); 
    return true; 
} 
+0

ありがとうございました。最後の2行(new_node-> next = table [hashed_word];テーブル[hashed_word] = new_node;)を説明してください。 new_node-> nextポインタがインデックスhashed_wordでテーブルにポイントされ、次にnew_nodeがインデックスhashed_wordでテーブルに割り当てられるように見えます。それがnew_nodeを指すnew_nodeのポインタを終了させないでください。 – user1636588

+0

@ user1636588:これらの2行は、新しいノードをテーブルのそのインデックスのリストの先頭に置きます。したがって、テーブルは新しいノードを指し、新しいノードは以前テーブルのリストの先頭にあったものを指します。テーブルが空の場合(開始時に)NULLになります。 –

関連する問題