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 ...