以前の続き。
キーの管理はハッシュテーブル内で。値の管理はハッシュテーブル外で。容量は決めうち。
#include <stdlib.h>
#include <string.h>#define HASH_MAX_SIZE 64 // ハッシュの最大サイズ
typedef struct _Hash {
int size;
char *keys[HASH_MAX_SIZE];
void *values[HASH_MAX_SIZE];
} Hash;void *HASH_Create() {
Hash *hash;hash = malloc(sizeof(Hash));
hash->size = 0;return hash;
}void HASH_Release(Hash *hash) {
int i;for(i = 0; i < hash->size; i++)
free(hash->keys[i]);free(hash);
}int HASH_Find(Hash *hash, const char *key) {
int i;for(i = 0; i < hash->size; i++) {
if(strcmp(key, hash->keys[i]) == 0) {
return i;
}
}return -1;
}void *HASH_Put(Hash *hash, const char *key, void *value) {
int i;
void *existing;i = HASH_Find(hash, key);
if(i >= 0) {
existing = hash->values[i];
hash->values[i] = value;
return existing;
}hash->keys[hash->size] = malloc(strlen(key) + 1);
strcpy(hash->keys[hash->size], key);
hash->values[hash->size] = value;hash->size++;
return NULL;
}void *HASH_Get(Hash *hash, const char *key) {
int i;i = HASH_Find(hash, key);
return (i >= 0) ? hash->values[i] : NULL;
}void *HASH_Remove(Hash *hash, const char *key) {
int i;
void *existing;i = HASH_Find(hash, key);
if(i < 0)
return NULL;
free(hash->keys[i]);
existing = hash->values[i];for(; i < (hash->size - 1); i++) {
hash->keys[i] = hash->keys[i+1];
hash->values[i] = hash->values[i+1];
}hash->keys[i] = NULL;
hash->values[i] = NULL;hash->size--;
return existing;
}