ハッシュテーブル

以前の続き。
キーの管理はハッシュテーブル内で。値の管理はハッシュテーブル外で。容量は決めうち。


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