模塊代碼函數
【1.定義一個哈希算法結構體】
#define MAX_SIZE 10
typedef int DataType;
typedef enum{EXIST, EMPTY, DELETE}State;
typedef struct HTElem
{
DataType _data;
State _state;
}HTElem;
typedef struct HashTable
{
HTElem _array[MAX_SIZE];
int _total;//哈希表中元素的個數
int _size;//計算哈希表中有效元素的個數
}HashTable, HT;
完整代碼塊
/***************************************/
//Hash.h
#define MAX_SIZE 10
typedef int DataType;
typedef enum{EXIST, EMPTY, DELETE}State;
typedef struct HTElem
{
DataType _data;
State _state;
}HTElem;
typedef struct HashTable
{
HTElem _array[MAX_SIZE];
int _total;//哈希表中元素的個數
int _size;//計算哈希表中有效元素的個數
}HashTable, HT;
//哈希表的初始化
void InitHashTable(HT *ht);
//哈希表的插入
void InsertHashTable(HT *ht, DataType data);
//哈希表的刪除
void DeleteHashTable(HT *ht, DataType data);
//哈希表的查找
int FindHashTable(HT *ht, DataType data);
//計算哈希表長度
int SizeHashTable(HT *ht);
//哈希表的判空
int EmptyHashTable(HT *ht);
//計算哈希地址
int FuncHash(DataType data);
/***************************************/
//Hash.c
#include <assert.h>
//哈希表的初始化
void InitHashTable(HT *ht)
{
assert(ht);
int i = 0;
for (; i < MAX_SIZE; ++i)
ht->_array[i]._state = EMPTY;
ht->_size = 0;
ht->_total = 0;
}
//哈希表的插入
void InsertHashTable(HT *ht, DataType data)
{
int hashAddr;
int i = 0;
assert(ht);
if (ht->_total == MAX_SIZE)//說明哈希表元素已滿
return;
//計算哈希地址
hashAddr = FuncHash(data);
while (EMPTY != ht->_array[hashAddr]._state)
{
if (EXIST == ht->_array[hashAddr]._state)
{
if (data == ht->_array[hashAddr]._data)
return;
}
#if 0
hashAddr++;
if (hashAddr == MAX_SIZE)//越界了,從頭開始訪問
hashAddr = 0;
#else
//二次探測
i++;
hashAddr = hashAddr + 2 * i + 1;
if (hashAddr >= MAX_SIZE)
hashAddr %= MAX_SIZE;
#endif
}
//插入元素
ht->_array[hashAddr]._data = data;
ht->_array[hashAddr]._state = EXIST;
ht->_size++;
ht->_total++;
}
//哈希表的刪除
void DeleteHashTable(HT *ht, DataType data)
{
assert(ht);
if (-1 != FindHashTable(ht, data))
{
ht->_array[FindHashTable(ht, data)]._state = DELETE;
ht->_size--;
}
}
//哈希表的查找
int FindHashTable(HT *ht, DataType data)
{
int hashAddr;
int i=0;
assert(ht);
hashAddr = FuncHash(data);
while (EMPTY != ht->_array[hashAddr]._state)
{
if (EXIST == ht->_array[hashAddr]._state)
{
if (data == ht->_array[hashAddr]._data)
return hashAddr;
}
#if 0
hashAddr++;
if (hashAddr == MAX_SIZE)//越界了,從頭開始訪問
hashAddr = 0;
#else
//二次探測
i++
hashAddr = hashAddr + 2 * i + 1;
if (hashAddr >= MAX_SIZE)
hashAddr %= MAX_SIZE;
#endif
}
return -1;
}
//計算哈希表長度
int SizeHashTable(HT *ht)
{
assert(ht);
return ht->_size;
}
//哈希表的判空
int EmptyHashTable(HT *ht)
{
assert(ht);
return 0 == ht->_size;
}
//計算哈希地址
int FuncHash(DataType data)
{
return data%MAX_SIZE;
}
/***************************************/
//test.c
#include"Hash.h"
#include <stdio.h>
void TestHash()
{
HashTable ht;
InitHashTable(&ht);
InsertHashTable(&ht, 23);
InsertHashTable(&ht, 14);
InsertHashTable(&ht, 35);
InsertHashTable(&ht, 22);
InsertHashTable(&ht, 27);
InsertHashTable(&ht, 17);
printf("size = %d\n", SizeHashTable(&ht));
if (-1 == FindHashTable(&ht, 17))
printf("17 這個元素不存在\n");
else
printf("17 這個元素存在\n");
if (-1 == FindHashTable(&ht, 37))
printf("37 這個元素不存在\n");
else
printf("37 這個元素存在\n");
}
int main()
{
TestHash();
system("pause");
return 0;
}
結果輸出: