头文件
- Hash.h
#pragma once
#ifndef HASH_H_
#define HASH_H_
#define size_t unsigned long
typedef enum { EM, EXIST, DEL } State;
typedef int Value;
//typedef char* Value;
typedef struct _DataType
{
size_t Key;
Value value;
}DataType;
typedef int(*PHF)(DataType* data);
typedef struct _Elem
{
DataType _data;
State _state;
}Elem;
typedef struct HashTable
{
Elem *_Tf;
size_t _size;
size_t _capacity;
PHF _pSetKey;
int LoadFactor;
}*PHash,Hash;
int HashFun(size_t Key, PHash hash);//线性探测
int HashFun2(size_t Key, PHash hash,int i);//二次探测
//线性探测
void InitHash(PHash hash, int capacity, PHF);
int InsertHash(PHash hash, Value value);
int FindHash(PHash hash, Value value);
int RemoveHash(PHash hash, Value value);
void DestoryHash(PHash hash);
size_t Size(Hash hash);
size_t Capacity(Hash hash);
int EmptyHash(Hash hash);
int IsFull(Hash hash);
void DynamicCapacity(PHash hash);
void Swap(PHash pLeft, PHash pRight);
//二次探测
int InsertHash_2(PHash hash, Value value);
int FindHash_2(PHash hash, Value value);
int RemoveHash_2(PHash hash, Value value);
#endif //!HASH_H_
- common.h
#pragma once
#include"Hash.h"
#ifndef _COMMON_H_
#define _COMMON_H_
#define _PrimeSize 31
#define size_t unsigned long
static const unsigned long _PrimeList[_PrimeSize] =
{
11ul,13ul,29ul,53ul, 97ul, 193ul, 389ul, 769ul,
1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
1610612741ul, 3221225473ul, 4294967291ul
};
unsigned long GetPrimeNumber(int Capacity);
static size_t BKDRHash(const char * str);
void IntToInt(DataType* data);
void CharToInt(DataType* data);
#endif // !_COMMON_H_
源文件
- common.c
#include"common.h"
size_t GetPrimeNumber(int Capacity)//得到最接近的质数
{
for (int i = 0; i < _PrimeSize; i++)
{
if (_PrimeList[i] > Capacity)
return _PrimeList[i];
}
return _PrimeList[_PrimeSize];
}
static size_t BKDRHash(const char * str)//字符串哈希算法
{
unsigned int seed = 131; // 31 131 1313 13131 131313</