哈希算法(閉散列)

模塊代碼函數
【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;
}

結果輸出:
這裏寫圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章