#include "Dict.h" #ifdef DICT_HASH_OPEN_ADDRESS_C #define _CRT_SECURE_NO_WARNINGS #include <string.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include "fnvhash_32a.h" #include "jhash.h" #define MAX_HASH 16384 #define TABLE_SIZE (MAX_HASH*2) // Ìàññèâ ñïèñêîâ char* hashtable[TABLE_SIZE]; int hash(char* word) { int hash_value = (int)fnv_32a_str(word, FNV1_32A_INIT); hash_value = TINY_FNV(14, hash_value); return hash_value; } void Insert(char* word) { int hash_value = hash(word); while (hashtable[hash_value] != NULL && strcmp(hashtable[hash_value], word) != 0) { hash_value++; if (hash_value >= TABLE_SIZE) { printf("Index out of range\n"); exit(1); } } hashtable[hash_value] = (char*)calloc(strlen(word) + 1, sizeof(char)); if (hashtable[hash_value] == NULL) { printf("Out of memory\n"); exit(1); } strcpy(hashtable[hash_value], word); } /* MEMBER – ñîîáùàåò, ÿâëÿåòñÿ ëè óêàçàííûé ýëåìåíò ÷ëåíîì äàííîãî ìíîæåñòâà èëè íåò. */ int Member(char* word) { int hash_value = hash(word); while (hashtable[hash_value] != NULL) { if (strcmp(hashtable[hash_value], word) == 0) { return 1; } hash_value++; if (hash_value >= TABLE_SIZE) { printf("Index out of range\n"); exit(1); } } return 0; } /* CREATE - ñîçäàåò ñëîâàðü. Âûçûâàåòñÿ ïåðåä íà÷àëîì èñïîëüçîâàíèÿ ñëîâàðÿ. */ void Create() { for (int i = 0; i < MAX_HASH; i++) hashtable[i] = NULL; } /* DESTROY - óíè÷òîæàåò ñëîâàðü. Âûçûâàåòñÿ ïîñëå îêîí÷àíèÿ èñïîëüçîâàíèÿ ñëîâàðÿ. */ void Destroy() { for (int i = 0; i < MAX_HASH; i++) { free(hashtable[i]); hashtable[i] = NULL; } } #endif