ROBボーデン:こんにちは。 私はロブだし、レッツハッシュ このソリューションが不足しています。 そこでここでは、実装するつもりだ 一般的なハッシュテーブル。 私たちは、ハッシュの構造ノードが分かり テーブルは次のようにしようとしている。 だから、char型の言葉を持っているために起こっている サイズ長さプラス1の配列。 最大以来1を忘れてはいけない 辞書内の単語は45です 文字、その後、我々はするつもりだ のための1余分な文字を必要とする バックスラッシュ0。 して、それぞれに私たちのハッシュテーブル バケットは、保存しようとしている ノードのリンクリスト。 ここでは、プロービング線形をしていない。 だから次のリンクするために バケット内の要素、私たちが必要とする 次の構造体ノード*。 だから、ノードは次のようになります。 今、ここに宣言です 当社のハッシュテーブルの。 これは、16,384バケツを持っているつもりが、だ その数は本当に重要ではありません。 そして最後に、我々は持っているつもりです グローバル変数hashtable_size、その 0としてオフを開始する予定、それはださ どのように多くの単語を追跡しようとして 私たちの辞書にあった。 わかりました。 それでは、負荷を見てみましょう。 だから負荷に気づく、 それはBOOLを返します。 それが成功した場合はtrueを返す それ以外の場合はロードされ、falseを返します。 そして、それはcon​​stのchar *のスターを取る 辞書で辞書、 我々はオープンしたいという。 だから、最初のことだ 私たちは、やろうとしている。 私たちは辞書をfopenのつもりだ 読んで、私たちは持っているつもりです それがそうであれば成功したことを確認します それはnullを返し、その後、我々はしませんでした 成功した辞書を開く そして我々はfalseを返す必要があります。 しかし、それは成功しなかったと仮定して オープン、その後、我々は読んでもらいたい 辞書。 我々はいくつかを見つけるまでそのループを保つ このから抜け出すべき理由 私達が表示されますループ。 そうルーピング保ち、そして今、我々は行っている 単一のノードをのmallocする。 そしてもちろん、我々はチェックをエラーする必要があります 再びmallocingは成功しませんでしたので、もし そして我々は、我々のいずれかのノードをアンロードする 前のmallocに起こった、閉じ 辞書とfalseを返します。 しかし、我々が想定していることを無視し 成功し、その後、我々は関数fscanf利用したい から単一の単語を読むために私たちの 私たちのノード辞書。 だから、エントリ - >単語が文字であることを忘れないでください ワードサイズの長さの緩衝液+ 我々はするつもりだ1 インチの単語を保存 だから、関数fscanfは限り1を返すために起こっている それが成功して読み取ることができたとして ファイルから単語。 エラーのいずれかが起こるか、我々が到達した場合 ファイルの最後には、それはないでしょう そうでない場合は、ケース内の1を返す 1を返す、我々は最終的に破るつもりだ このwhileループの外。 だから我々は、かつて我々が成功していることがわかります に単語を読む エントリー>言葉は、我々は、ハッシュするつもりだ 我々のハッシュ関数を用いてその単語。 それでは見てみましょう ハッシュ関数。 だから、本当に必要はありません。 これを理解する。 そして実際に、私たちは、これを引っ張っ インターネットから関数をハッシュ。 あなたが認識する必要がある唯一のものです これはcon​​stのchar *文字の単語を取ることを、 そのためには、入力として文字列を取っているし、 出力として符号なし整数を返す。 だから、すべてのハッシュ関数ですそれは、そうです 入力を取り込み、それはあなたに与えます ハッシュテーブルへのインデックス。 我々はNUM_BUCKETSで改造していることに注意してください そのハッシュ値を返す 実際にハッシュテーブルへのインデックスです 以降もインデックスされない 配列の境界。 だから、ハッシュ関数、我々が行っていることを考えると 我々は読んで単語をハッシュする 辞書から、その後、我々は行っている それを使用するためには、挿入する必要が ハッシュテーブルにエントリ。 今、ハッシュテーブルハッシュは、現在ある ハッシュテーブルにリストを連結し、かつ それだけでnullであることは非常に可能性があります。 我々は、我々のエントリを挿入したい このリンクリストの先頭、など 我々は我々の現在のエントリを持っているつもりです 現在、どのようなハッシュテーブルを指す ポイントにして、私たちは保存するつもりだ ハッシュのハッシュ·テーブル内の 現在のエントリ。 だから、この2行は正常に挿入 の先頭にエントリー そのインデックスのリンクリスト ハッシュテーブルに。 我々はそれに終わったら、知っている 我々は、別の単語を見つけた 辞書と我々は再び増加します。 だから我々はやり続けることはfscanfまで、 最終的に非何か1を返します。 その時点では、我々がする必要があることを覚えておいて 入場無料なので、ここまで、我々はmallocさ エントリーと我々は何かを読み取ろうとしました 辞書から。 そして、我々は正常に読み込まれませんでした 辞書から何か 我々は我々のエントリを解放する必要がある場合 実際にハッシュテーブルに入れたことがない そして最終的に分割します。 我々は抜け出すと、我々は、よく、見る必要がある 我々は、理由があっ抜け出すんでした ファイルからの読み取りエラーが発生したか、 我々は達したので、私たちは抜け出すんでした ファイルの終わり? エラーがあったなら、私たちがしたい 負荷がなかったため、falseを返す 成功し、その過程で、私たちがしたい 我々は読んですべての単語をアンロード と辞書ファイルを閉じます。 我々は成功しなかったと仮定すると、我々だけで それでも辞書を閉じる必要が ファイル、そして最後には、以来、trueを返す 我々は正常にロードされました 辞書。 そして、それは、負荷のためにそれだ。 だから今、ロードされたハッシュテーブル与えられ、確認してください、 このように起こっている。 そう、それはBOOLを返す、チェックしている かどうかを示すために起こっている 渡されたchar *文字の単語、かどうか 渡された文字列は、私たちの辞書にある。 だからである場合には、辞書にある場合 当社のハッシュテーブルに、我々は戻ります 真、そうでないなら、 我々はfalseを返します。 これは、渡された単語を考えると、我々はしている 単語をハッシュする予定。 今、認識することが重要なことは ロードでは、我々は知っていたことをすべてのこと 言葉は小文字であることを行った、 しかしここでは、そのようにわからない。 我々はハッシュ関数を見てみると、 実際に私たちのハッシュ関数 各文字を小文字化されている 言葉の。 だから関係なく、総額 言葉、私たちのハッシュ関数は、しようとしている 何のために同じインデックスを返す 時価総額は、それがなければならないようです。 完全に小文字に返さ Wordのバージョン。 わかりました。 だから、Googleのインデックスです。 それは、この単語のためのハッシュテーブルです。 今、forループはこれが起こっている リンクリストの上へ つまり、そのインデックスにあった。 だから我々は、エントリを初期化しているに気づく そのインデックスを指すように設定します。 私たちは、エントリがない間継続するつもりだ 等しくないNULL、と覚えている 私たちのリンクリストポインタを更新 エントリは次のエントリ->に等しいので、持っている に私たちの現在のエントリ·ポイント リンクリストの次のアイテム。 わかりました。 だから、リンクリスト内のエントリごとに、 私たちは、strcasecmpを使用するつもりだ。 それははstrcmpはないので、再び、我々 区別せず物事のケースをやってみたい。 だから我々は言葉を比較するためにstrcasecmpを使用 それは、この関数に渡されました 単語に対して、その このエントリにあります。 それが0を返した場合、それがあったことを意味 我々がしたい、その場合に一致すると、 trueを返します。 我々が正常に見つかった 当社のハッシュテーブル内の単語。 一致するものがなかった場合、我々はしている 再びループに行くと見て 次のエントリー。 そして、我々はしばらくの間そこにループし続けます このリンクリスト内のエントリです。 私たちは壊れた場合はどうなります forループこれのうち? それは我々がそのエントリを見つけられませんでした意味 その場合には、この言葉を一致 私たちは、それを示すためにfalseを返す ハッシュテーブルには、この単語が含まれていませんでした。 そして、それはチェックのためにそれだ。 わかりました。 それでは、サイズを見てみましょう。 今、サイズが非常に簡単になるだろう 以来、単語ごとに、負荷に覚えている 我々はグローバルに増分発見 変数hashtable_size。 だから、size関数はただです そのグローバルを返しに行く 変数で、それはそれだ。 ついに、我々はアンロードする必要があります 辞書すべてが済んだら。 では、どのようにそれをするつもりですか? 右ここでは、すべての上にループしています 当社のハッシュテーブルのバケット。 そうNUM_BUCKETSバケットがあります。 そして、我々のハッシュ内の各リンクリストのための テーブル、我々をループするつもりだ リンクリストの全体 各要素を解放する。 今、我々は注意する必要があるので、ここでは の一時変数を持っている 次のポインタを格納 リンクされたリスト内の要素。 そして、我々は自由になるだろう 現在の要素。 我々は、我々以来、これを行うことを確認する必要があり ただ、現在の要素を解放することはできません して、次のポインタにアクセスしよう 以来、一度我々はそれを解放 メモリは無効になります。 だから我々は体へのポインタの周りに維持する必要があります 次の要素は、その後、我々は解放することができます 現在の要素、そして、我々は更新することができます を指すように私たちの現在の要素 次の要素。 要素が存在している間、我々はよループ このリンクリスト内。 我々は、すべてのリンクされたリストのことをやる ハッシュテーブル、そして我々が終わっ回 それにより、我々は完全にアンロードされました ハッシュテーブル、そして我々は完了です。 だから、アンロードするために、これまでは不可能だ falseを返し、そして我々が完了したら、我々は ただtrueを返す。