標頭檔案
#pragma once
#ifndef hash_h_
#define hash_h_
#define size_t unsigned long
typedef enum state;
typedef int value;
//typedef char* value;
typedef struct _datatype
datatype;
typedef int(*phf)(datatype* data);
typedef struct _elem
elem;
typedef struct hashtable
*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_
#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] =
;unsigned
long getprimenumber(int capacity);
static size_t bkdrhash(const
char * str);
void inttoint(datatype* data);
void chartoint(datatype* data);
#endif // !_common_h_
原始檔
#include"common.h"
size_t getprimenumber(int capacity)//得到最接近的質數
return _primelist[_primesize];
}static size_t bkdrhash(const
char * str)//字串雜湊演算法
return (hash & 0x7fffffff);
}void inttoint(datatype* data)//整形資料轉整形
void chartoint(datatype* data)//字串資料轉整形
#include
#include
#include
#include
#include"hash.h"
#include"common.h"
//初始化
void inithash(phash hash, int capacity, phf _psetkey)
datatype buynewdata(value value, phash hash)
//插入
int inserthash(phash hash, value value)
int addr = hashfun(new.key, hash);
while (em != hash->_tf[addr]._state && flag < hash->_capacity )
if (hash->_tf[addr]._state == em)
return0;}
//線性探測雜湊函式
int hashfun(size_t key, phash hash)
//搜尋
int findhash(phash hash, value value)
addr++;
flag++;
}return0;}
//刪除元素
int removehash(phash hash, value value)
addr++;
flag++;
}return0;}
//銷毀雜湊表
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)
swap(&hashnew, hash);
free(hashnew._tf);
}void swap(phash pleft, phash pright)
--測試
void test_int
()void test_char
()void test_1
()//二次探測//
int inserthash_2(phash hash, value value)
int addr = hashfun_2(new.key, hash,flag);
while (em != hash->_tf[addr]._state)
if (hash->_tf[addr]._state == em)
return0;}
int findhash_2(phash hash, value value)
flag++;
addr = hashfun_2(new.key, hash, flag);
}return0;}
int removehash_2(phash hash, value value)
flag++;
addr = hashfun_2(new.key, hash, flag);
}return0;}
int hashfun_2(size_t key, phash hash, int i)//二次探測
void test_2
()void main
()
雜湊之閉雜湊(線性探測 二次探測)
hashtable.h include include include include common.h 雜湊表位置的狀態 typedef enum state state typedef int datatype typedef char datatype 轉換int函式指標 typedef si...
雜湊表之線性探測和二次探測
雜湊表又稱雜湊表。雜湊表儲存的基本思想是 以資料表中的每個記錄的關鍵字 k為自變數,通過一種函式h k 計算出函式值。把這個值解釋為一塊連續儲存空間 即陣列空間 的單元位址 即下標 將該記錄儲存到這個單元中。在此稱該函式h為哈函式或雜湊函式。按這種方法建立的表稱為雜湊表或雜湊表。處理衝突的方法 開放...
雜湊的故事 之 二次探測和hashtable
雜湊真的給我留下了巨大的陰影 二次探測 若當前key與原來key產生相同的雜湊位址,則當前key存在該位址後偏移量為 1,2,3 的二次方位址處 key1 hash key 0 key2 hash key 1 2 key3 hash key 2 2 二次探測法中會每乙個空間採用乙個狀態標識來解決直接...