雜湊表(開雜湊)

2021-08-19 14:19:15 字數 3391 閱讀 2748

hash_table2.h

#pragma once

#include

#define hashmaxsize 1000

typedef

int keytype;

typedef

int valtype;

typedef size_t (*hashfunc)(keytype key);

typedef

struct hashelem hashelem;

// 陣列的每乙個元素是乙個不帶頭節點的鍊錶

// 對於空鍊錶,我們使用 null 來表示

typedef

struct hashtable hashtable;

void hashinit(hashtable* ht, hashfunc hash_func);

//約定雜湊表中不能包含 key 相同的值。

int hashinsert(hashtable* ht, keytype key, valtype value);

int hashfind(hashtable* ht, keytype key, valtype* value);

void hashremove(hashtable* ht, keytype key);

size_t hashsize(hashtable* ht);

int hashempty(hashtable* ht);

void hashdestory(hashtable* ht);

hash_table2.c

#include "hash_table2.h"

#include

void hashinit(hashtable* ht, hashfunc hash_func)

}hashelem* createhashelem(keytype key, valtype value)

hashelem* hashbucketfind(hashelem* head, keytype key)

} return null;

}int hashbucketfindcurandprev(hashelem* head, keytype key,

hashelem** cur_output, hashelem** prev_output)

} return0;}

int hashinsert(hashtable* ht, keytype key, valtype value)

//1. 根據hash函式,將key轉化成對應的陣列下標

size_t offset = ht->hash_func(key);

//2. 判定當前的key在鍊錶是是否存在

hashelem* result = hashbucketfind(ht->data[offset], key);

if (result != null) else

}int hashfind(hashtable* ht, keytype key, valtype* value)

//1. 根據 key 找到對應的雜湊桶

size_t offset = ht->hash_func(key);

//2. 對該hash桶進行鍊錶查詢

hashelem* ret = hashbucketfind(ht->data[offset], key);

// a) 如果鍊錶上沒有找到對應key,查詢失敗,不存在

if (ret == null) else

}void destoryhashelem(hashelem* ptr)

void hashremove(hashtable* ht, keytype key)

//1. 根據key找到對應的雜湊桶

size_t offset = ht->hash_func(key);

//2. 查詢key這個元素是否在雜湊桶的鍊錶上

hashelem* cur = null;

hashelem* prev = null;

int ret = hashbucketfindcurandprev(ht->data[offset], key, &cur, &prev);

if (ret == 0)

if (cur == ht->data[offset]) else

destoryhashelem(cur);

--ht->size;

return;

}size_t hashsize(hashtable* ht)

return ht->size;

}int hashempty(hashtable* ht)

return ht->size == 0 ? 1 : 0;

}void hashdestory(hashtable* ht)

// 1. size 置為 0

ht->size = 0;

// 2. hash_func 置為 null

ht->hash_func = null;

// 3. 銷毀hash桶上的每乙個鍊錶

size_t i = 0;

for(; i < hashmaxsize; ++i)

}}//////

//////

//////

//////

//////

///////

//////

///以下是測試**///

//////

/////

//////

//////

//////

//////

//////

///////

#if 1

#include

#define test_header printf("\n**********====%s**********===\n", __function__)

void hashprintint(hashtable* ht, const

char* msg)

printf("[%lu] ", i);

hashelem* cur = ht->data[i];

for (; cur != null; cur = cur->next)

printf("\n");

}}size_t hashfuncdefault(keytype key)

void testinit()

}}void testinsert()

void testfind()

void testremove()

void testsize()

void testdestory()

int main()

#endif

雜湊表 開雜湊

開雜湊很簡單。asl的計算忘了,找了兩道題都沒算對,這才是我不寫的真正原因 裡是裝13用的 include using namespace std 雜湊表 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關 鍵碼值對映到表中乙...

雜湊表 開雜湊

開雜湊 首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中。負載因子a不超過0.5 如果超出必須考慮增容 struct hashbucknode 結點 hashbucknode,pha...

雜湊表之開雜湊

了解雜湊基本看概念請看這裡 搜尋結構之雜湊 開雜湊完整 開雜湊 開雜湊每乙個位址的底層實現像乙個個的桶,所以又叫雜湊桶,同乙個桶中存放雜湊衝突的元素。通常,每個桶對應的鍊錶結點都很少,將n個關鍵碼通過某乙個雜湊函式,存放到雜湊表中的m個桶中,那麼每乙個桶中煉表的平均長度為n m,以搜尋平均長度為n ...