ハッシュの問題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kakedasi

ハッシュの問題

#1

投稿記事 by kakedasi » 14年前

データをハッシュに追加する問題で以下の関数を作れという問題なのですが、組んでみたところコンパイルエラーが起きてしまいます。
どこがおかしいのと、どうすればいいのかをご教授していただけると幸いです。


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;
}







アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: ハッシュの問題

#2

投稿記事 by h2so5 » 14年前

Ideone.comで試しましたがコンパイルエラーは出ませんでした。
http://ideone.com/7nCw4

どういったエラーが出るのでしょうか?

kakedasi

Re: ハッシュの問題

#3

投稿記事 by kakedasi » 14年前

できてますね、もう一度確認してきます。
もうしわけありませんでした。

閉鎖

“C言語何でも質問掲示板” へ戻る