c言語でハッシュを作成したいです。
プログラムの全体は以下のようです。
ここでハッシュを操作する関数を定義します。
HashAlloc:サイズnのハッシュテーブルを動的生成
HashFree:ハッシュテーブルの開放
HashAdd:データ追加
HashGet:データの検索と取得
HashDelete:データ削除
HashCode:ハッシュ値計算。除数はn
以下に示したようにそれぞれ関数を定義したのですが、出力結果には何も表示されません。
お力添えいただければ幸いです。
#include <stdio.h> #include <stdlib.h> #include <string.h> /* ハッシュテーブル構造定義 */ enum { FALSE = 0, TRUE = 1 }; enum { EMPTY = 0, FULL = 1 } ; typedef struct { char key[64]; char value[64]; int state; /* FULL:使用中 EMPTY:未使用 */ } HashRecord; typedef struct { int size; HashRecord *table; } Hash; Hash* HashAlloc(int n); void HashFree(Hash *); int HashAdd(Hash *, char *, char *); int HashGet(Hash *, char *, char *); int HashCode(Hash *, char *); void HashDump(Hash *); // Hash* HashAlloc(int n){ Hash* hash=malloc(sizeof(Hash)); if(hash->table=calloc(n,sizeof(HashRecord))==NULL){ free(hash); return NULL; } hash->table->state=EMPTY; hash->size=n; return hash; } void HashFree(Hash *s){ free(s->table); free(s); } int HashCode(Hash *hash,char *key){ int strLen(const char s[]){ int len =0; while(s[len]) len++; return len; } if(strLen(key)==0){return 0;} else if(strLen(key)==1){ return key[0] % hash->size -8; }else{ int n = strLen(key); int x = (key[0] - 65 + 26* (key[n/2 -1] - 65) + 26 * 26 * (key[n-2] - 65 )) % hash->size; return x; } } int HashAdd(Hash *hash, char *key, char *value){ int h=0; HashRecord *p; h=HashCode(hash,key); *p = hash->table[h]; if(p->state == FULL){ return FALSE; } *p->key = key; *p->value = value; p->state =FULL; return TRUE; } int HashGet(Hash *hash, char *key, char *value){ int h; HashRecord *p; h=HashCode(hash,key); *p = hash->table[h]; if(p->state == EMPTY && p->key != key){ return FALSE; } value = p->value; return FALSE; } // ハッシュテーブルのレコードを全て表示する(ハッシュが空でも表示). void HashDump(Hash *hash) { int i; for (i = 0; i < hash->size; i++) { printf("%4d: ", i); switch (hash->table[i].state) { case FULL: printf("(%s, %s)", hash->table[i].key, hash->table[i].value); break; case EMPTY: printf("empty"); break; default: printf("unknown"); break; } printf("\n"); } } int main(void) { int size = 0, h; char cmd, key[64], value[64], buf[64]; Hash *hash; // ハッシュテーブルの生成 printf("ハッシュテーブルの大きさを入力して下さい?> "); scanf("%d", &size); if (size < 1) return -1;// 入力数エラー hash = HashAlloc(size); if (hash == NULL) return -1; // メモリ確保失敗 puts("* ハッシュテーブルを操作するコマンドを入力して下さい."); puts("* a: データを格納"); puts("* g: キーに対応するデータの取得"); puts("* p: ハッシュテーブルを表示"); puts("* q: 終了"); do { printf("?> "); scanf("%s", buf); cmd = buf[0]; switch (cmd) { case 'a': /* データを格納 */ printf("名前と血液型をスペース区切りで入力して下さい(例|HANA A): "); scanf("%s %s", key, value); printf("%c -> %s %s\n", cmd, key, value); if (HashAdd(hash, key, value) == TRUE) { printf("(%s, %s) を格納しました.\n", key, value); } else { /* 衝突 */ printf("重複しています.\n"); } break; case 'g': /* キーに対応するデータを取得 */ printf("名前を入力して下さい: "); scanf("%s", key); printf("%c -> %s\n", cmd, key); if (HashGet(hash, key, value) == TRUE) { printf("%sの血液型は%sです.\n", key, value); } else { printf("%sは登録されていません.\n", key); } break; case 'p': /* データを表示 */ printf("%c\n", cmd); HashDump(hash); break; case 'q': /* 終了 */ printf("%c\n", cmd); puts("プログラムを終了します."); break; case '\n': /* 改行 */ case '\r': /* 復帰 */ break; default: /* 入力エラー */ puts("不正なコマンドです."); break; } } while (cmd != 'q'); HashDump(hash); // 解放前の出力 HashFree(hash); // メモリ解放 return 0; }
> 以下に示したようにそれぞれ関数を定義したのですが、出力結果には何も表示されません。
どこまで意図通り正しく動いているか、確認されているのでしょうか。作りっぱなしではなく、まずご自身でデバッグしましょう。
返信ありがとうございます。
おそらくハッシュテーブルの動的生成の部分がうまくいっていないためだと考えられます。
「出力結果」って、何のことですか?
HashDump()が呼び出されない、ってことですか?
そういう事を、第三者に分かるように書いて下さい、ということです。
ハッシュテーブルが怪しいなら、その内容を printf() などで確認しましょう。
そういう作業はプログラムの作成者がすべきことです。