ハッシュ関数の実行を終了しましたが、すべてではなく同じアドレスを出力しているようです。また、まったく同じアドレスを何度も出力するだけです。これが構造体の配列に追加されるので、エラーは「Put」関数にあるとほぼ確信しています。しかし、バグがどこかにある場合に備えて、すべてのコードをここに残しておきます。ASCIIの任意のファイルを使用できるかどうかをテストするためにファイルからデータを取得します。事前のアドバイスありがとうございます!
私が作った構造はここにあります:
typedef struct HashNode{
char* key;
int data;
struct HashNode* next;
} HashNode;
typedef struct Hashtable{
int size;
struct HashNode** hashArray;
} Hashtable;`
彼らは私が彼らに入力したものを保持していないので、彼らには何か問題があるに違いありません。
あなたPut
は常に同じ文字列、word
キーとしてあなたのハッシュに。その文字列は繰り返し上書きされており、最後のキーの内容が含まれています。(さらに悪いことに、ノードのhas値は、最後のキーを除いてキーと一致しません。)
これを修正する1つの方法は、ハッシュテーブルにキーを所有させることです。キーをコピーするか(おそらくを使用してstrdup
)、構造内のキーを配列strcpy
にします。それらをコピーするときは、既存のキーの値が上書きされるときではなく、キーが最初にhasテーブルに挿入されるときにのみコピーする必要があります。配列を使用する場合、特定の長さまでの文字列のみを処理できることは明らかです。
別の方法は、すべてのキーが異なるメモリアドレスを指していることを確認することです。これは、入力全体をメモリに格納し、キーポインタをそのメモリに作成する場合ですstrtok
。おそらく、からの結果です。入力メモリは、少なくともハッシュテーブルと同じ長さである必要があります。
編集:単語を読み取るためのコードは、単語を32文字に制限します(その制限を強制することはありません!)。したがって、コードの簡単な修正key
は、youirノードのエントリを32文字の配列にすることです。
typedef struct HashNode {
char key[32];
int data;
struct HashNode *next;
} HashNode;
次に、内容をのキーにコピーする必要がありますPut
。交換
node->key = keyWord;
と:
strcpy(node->key, keyWord);
これでカウントは機能しますが、コードにはまだいくつかの問題があります。例えば:
Put
、新しいノードが本当に必要な場合にのみ、事前にノードにメモリを割り当てないでください。そうしないと、メモリがリークします。Put
、クライアントコードではなく、によって計算する必要があります。これにより、全体で同じハッシュ関数が使用されるようになります。この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加