hashtable.h
#include
#include
#include
#include "common.h"
//雜湊表位置的狀態
typedef enum state
state;
typedef int datatype;
//typedef char* datatype;
//轉換int函式指標
typedef size_t(*pdt)(datatype str);
//鍵值對
typedef struct elem
elem;
typedef enum
isline;
//雜湊表
typedef struct hashtable
hashtable;
//初始化
void hashtableinit(hashtable * ht, int capacity, isline _dete, pdt setdata);
//插入
void hashtableinsert(hashtable *ht, datatype data);
//刪除
void hashtabledelete(hashtable *ht, datatype data);
//查詢
int hashtablefind(hashtable *ht, datatype data);
//元素個數
int hashtablesize(hashtable *ht);
//判空
int hashtableempty(hashtable *ht);
// 銷毀雜湊表
void hashtabledestory(hashtable* ht);
//////
//////
//////
//////
//////
//////
//////
/////輔助方法
//雜湊函式
int hashfunc(hashtable* ht, int data);
//線性探測
int islinedete(hashtable* ht, int hashaddr);
//二次探測
int detetwo(hashtable * ht, int hashaddr, int i);
//測試
void testhashdata();
void testhashstr();
hashtable.c#include "hashtable.h"
//初始化
void hashtableinit(hashtable * ht, int capacity, isline dete, pdt setdata)
//檢測容量
int checkcapacity(hashtable *ht)
//交換
void _swop(int * newht, int* oldht)
void swop(hashtable* newht, hashtable* oldht)
//擴容
void buycapacity(hashtable * ht)
//交換
swop(&newht, ht);
hashtabledestory(&newht);
}//插入
void hashtableinsert(hashtable *ht, datatype data)
int newdata = ht->_setdata(data);
hashaddr = hashfunc(ht, newdata);
while (empty != ht->_table[hashaddr]._state)
if (ht->_dete == _isline)
hashaddr = islinedete(ht, hashaddr);
else
hashaddr = detetwo(ht, hashaddr, ++i);
}//說明狀態為空,可以直接插入
ht->_table[hashaddr]._state = exist;
ht->_table[hashaddr]._data = data;
ht->_size++;
ht->_total++;
}//查詢元素,找到返回位址
int hashtablefind(hashtable * ht, datatype data)
//線性探測
if (ht->_dete == _isline)
else
//二次探測
hashaddr = detetwo(ht, hashaddr, ++i);
}return -1;
}//刪除
void hashtabledelete(hashtable *ht, datatype data)
//元素個數
int hashtablesize(hashtable *ht)
//判空
int hashtableempty(hashtable *ht)
// 銷毀雜湊表
void hashtabledestory(hashtable* ht)
//雜湊函式
int hashfunc(hashtable* ht, int data)
//線性探測
int islinedete(hashtable* ht, int hashaddr)
//二次探測
int detetwo(hashtable * ht, int hashaddr, int i)
void testhashdata()
#if0
void testhashstr()
#endif
common.c#include "common.h"
int getcapacity(size_t capacity)
return
_primelist[27];
}//將字串轉換為整數
size_t strtoint(const
char * str)
return (hash & 0x7fffffff);
}//整形轉無符號整形
size_t datatoint(int data)
common.h#pragma once
#define size_t unsigned long
#define _primesize 28
static
const
unsigned
long _primelist[_primesize] =
;//用來獲取容量,使每次都是素數
int getcapacity(size_t capacity);
size_t strtoint(const
char * str);
size_t datatoint(int data);
雜湊表之線性探測和二次探測
雜湊表又稱雜湊表。雜湊表儲存的基本思想是 以資料表中的每個記錄的關鍵字 k為自變數,通過一種函式h k 計算出函式值。把這個值解釋為一塊連續儲存空間 即陣列空間 的單元位址 即下標 將該記錄儲存到這個單元中。在此稱該函式h為哈函式或雜湊函式。按這種方法建立的表稱為雜湊表或雜湊表。處理衝突的方法 開放...
雜湊之線性探測法
資料結構實驗之查詢七 線性之雜湊表 time limit 1000ms memory limit 65536kb problem description 根據給定的一系列整數關鍵字和素數p,用除留餘數法定義hash函式h key key p,將關鍵字對映到長度為p的雜湊表中,用線性探測法解決衝突。重...
雜湊 線性探測法
time limit 1 secs,memory limit 256 mb 使用線性探測 法 linear probin g 可以解決雜湊中的衝突問題,其基本思想是 設雜湊函式為 h key d,並且假定雜湊的儲存結構是迴圈陣列 則當衝突發生時 繼續探測 d 1,d 2 直到衝突得到解決 例如,現有...