雜湊之閉雜湊(線性探測 二次探測)

2021-08-20 04:16:06 字數 3589 閱讀 4307

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 直到衝突得到解決 例如,現有...