ハッシュの問題
Posted: 2012年2月18日(土) 14:00
データをハッシュに追加する問題で以下の関数を作れという問題なのですが、組んでみたところコンパイルエラーが起きてしまいます。
どこがおかしいのと、どうすればいいのかをご教授していただけると幸いです。
int HashAlloc(Hash*, int);
void HashFree(Hash*);
int HashAdd(Hash*, char*, char*);
int HashDelete(Hash*, char*);
int HashGet(Hash*, char*, char*);
OSはLinux、でgccを使っていますよろしくお願いします
どこがおかしいのと、どうすればいいのかをご教授していただけると幸いです。
int HashAlloc(Hash*, int);
void HashFree(Hash*);
int HashAdd(Hash*, char*, char*);
int HashDelete(Hash*, char*);
int HashGet(Hash*, char*, char*);
OSはLinux、でgccを使っていますよろしくお願いします
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* ハッシュテーブル構造定義 */
enum {SUCCESS,FAIL};
enum { HASH_FULL, HASH_EMPTY };
typedef struct {
char key[1024];
char value[1024];
int empty; /* HASH_FULL:使用中 HASH_EMPTY:未使用 */
}HashRecord;
typedef struct {
int size;
HashRecord *table;
}Hash;
int HashAlloc(Hash*, int);
void HashFree(Hash*);
int HashAdd(Hash*, char*, char*);
void HashDump(Hash*);
int HashDelete(Hash*, char*);
int HashGet(Hash*, char*, char*);
int HashKey(Hash*, char*);
//
int HashAlloc(Hash *h, int n) {
int i;
h->size = n;
if ((h->table = malloc(sizeof(HashRecord) * n)) == 0)
return FAIL;
for (i = 0; i < n; i++)
(h->table)[i].empty = HASH_EMPTY;
return SUCCESS;
}
void HashFree(Hash *h) {
free(h->table);
}
int HashAdd(Hash *h, char *key, char *value) {
int n;
n = HashKey(h, key);
if ((h->table)[n].empty != HASH_FULL) {
(h->table)[n].empty = HASH_FULL;
strcpy((h->table)[n].key, key);
strcpy((h->table)[n].value, value);
return SUCCESS;
} else
return FAIL;
}
int HashDelete(Hash *h, char *key) {
int n;
n = HashKey(h, key);
if ((h->table)[n].empty == HASH_FULL) {
if (strcmp((h->table)[n].key, key) == 0) {
(h->table)[n].empty = HASH_EMPTY;
strcpy((h->table)[n].key, '\0');
strcpy((h->table)[n].value, '\0');
return SUCCESS;
}
}
return FAIL;
}
int HashGet(Hash *h, char *key, char *value) {
int n;
n = HashKey(h, key);
if ((h->table)[n].empty == HASH_FULL) {
if (strcmp((h->table)[n].key, key) == 0) {
strcpy(value, (h->table)[n].value);
return SUCCESS;
}else
return FAIL;
}else
return FAIL;
}
//// ハッシュテーブルのレコードを全て表示する(ハッシュが空でも表示).
void HashDump(Hash *hash) {
int i=0;
for (i = 0; i < hash->size; i++) {
if (hash->table[i].empty == HASH_FULL) {
printf("%d: %s=%s\n", i, hash->table[i].key, hash->table[i].value);
} else {
printf("%d: %s\n", i, hash->table[i].empty == HASH_EMPTY ? "empty" : "deleted");
}
}
}
int HashKey(Hash *hash, char *key){
int n=0;
n = strlen(key);
if (n == 1) return key[0] % hash->size;
return ((key[0]-'A'+(key[n/2-1]-'A')*26+(key[n-2]-'A')*26*26) % hash->size);
}
int main(void) {
int size=0;
char cmd, key[1024], value[1024];
Hash hash;
// ハッシュテーブルの生成
printf("ハッシュテーブルの大きさを入力して下さい:");
scanf("%d", &size);
if (size < 1) return FAIL;// 入力数エラー
if (HashAlloc(&hash, size) == FAIL) return FAIL; // メモリ確保失敗
puts("* ハッシュテーブルを操作するコマンドを入力して下さい.");
puts("* データを格納:a");
puts("* キーを削除:x");
puts("* キーに対応するデータの取得:g");
puts("* ハッシュテーブルを表示:d");
puts("* 終了:q");
do {
printf(":");
scanf("%c", &cmd);
switch (cmd) {
case 'a': /* データを格納 */
printf("名前を入力して下さい:");
scanf("%s", key);
printf("血液型を入力して下さい:");
scanf("%s", value);
if (HashAdd(&hash, key, value) == SUCCESS) {
printf("%s=%sを格納しました.\n", key, value);
} else { /* 衝突 */
printf("既に同じキーを持つデータが存在します.\n");
}
break;
case 'd': /* データを表示 */
HashDump(&hash);
break;
case 'x': /* キーを削除 */
printf("誰を削除しますか?:");
scanf("%s", key);
if(HashDelete(&hash, key) == SUCCESS) {
printf("%sを削除しました.\n", key);
}
else {
printf("%sは登録されていません.\n", key);
}
break;
case 'g': /* キーに対応するデータを取得 */
printf("名前を入力して下さい:");
scanf("%s", key);
if (HashGet(&hash, key, value) == SUCCESS) {
printf("%sの血液型は%sです.\n", key, value);
} else {
printf("%sは登録されていません.\n", key);
}
break;
case 'q': /* 終了 */
puts("プログラムを終了します.");
break;
case '\n': /* 改行 */
case '\r': /* 復帰 */
break;
default: /* 入力エラー */
puts("コマンドが正しくありません.");
break;
}
} while (cmd != 'q');
HashDump(&hash); // 解放前の出力
HashFree(&hash); // メモリ解放
return 0;
}