全域性變數:g_
陣列:a
指標:p
結構體:st
unsigned int:ui
需要定義hash衝突域。hash table中增加hash演算法和排序演算法,增強hasa table可用性。
/* hash衝突域鍊錶節點 */
typedef
struct taghash_list
hash_list_s;
/* hash表 */
typedef
struct taghash_table
hash_table_s;
hash表建立,指定hasa表長度。
/* hash表建立 */
hash_table_s *
hash_create
( in unsigned
int uitablesize,
in unsigned
int(
*pfunhash)
(const
void*)
, in unsigned
int(
*pfuncmp)
(unsigned
int uikey,
unsigned
int uioldkey)
) psthashtable->pphashlist =
malloc
(sizeof
(hash_list_s)
* uitablesize);if
(null
== psthashtable->pphashlist)
memset
(psthashtable->pphashlist,0,
sizeof
(hash_list_s)
* uitablesize)
; psthashtable->uitablesize = uitablesize;
psthashtable->pfunhash = pfunhash;
psthashtable->pfuncmp = pfuncmp;
return psthashtable;
}
hash表插入使用hash演算法找到index,再根據比較演算法找到插入的位置。實現了hash衝突域有序排列。
/* hash表插入 */
unsigned
inthash_insert
( in hash_table_s *psthashtable, in unsigned
int uikey)
uihashindex = psthashtable->
pfunhash((
void*)
&uikey)
; pstnewhashnode->uivalue = uikey;
psthashcmp = psthashtable->pphashlist[uihashindex]
;while
(psthashcmp)
psthashcmp = psthashcmp->phashlist;}if
(null
== psthashcmp)
/* 當前節點為衝突域中的最大值或者最小值 */
else
/* 當前節點為衝突域中的中間值,插入psthashcmp之後 */
#ifdef hash_trace
printf
("key %d index %d head %p node %p nextnode %p\n"
,uikey, uihashindex,
psthashtable->pphashlist[uihashindex]
,pstnewhashnode, pstnewhashnode->phashlist)
;#endif
}#ifdef hash_trace
else
#endif
return hash_ok;
}
hash查詢需要遍歷衝突域查詢。這是一般的查詢方法,對於實現了衝突域排序的hash表,可以使用二分法查詢。
/* hash表查詢 */
hash_list_s *
hash_find
( in hash_table_s *psthashtable, in unsigned
int uikey)
psthashfind = psthashfind->phashlist;
}return psthashfind;
}
/* hash表刪除 */
void
hash_destroy
(in hash_table_s * psthashtable)
}free
(psthashtable->pphashlist)
;free
(psthashtable)
;return
;}
/* hash表列印 */
unsigned
inthash_dump
( in hash_table_s *psthashtable )
for(uihashindex =
0; uihashindex < psthashtable->uitablesize; uihashindex++)}
printf
("%s"
, pcbuf)
;free
(pcbuf)
;}
100個數字0-99, 放到hash位址為0-19的hash表中, hash函式為key/5。將衝突值按大小順序排列放入衝突域鍊錶。
#define __test_process__
#define hashtest_mod 5
#define hashtest_size 20
unsigned
inthash
(const
void
* pkey)
unsigned
intcmp
(unsigned
int uikey,
unsigned
int uioldkey)
void
main()
for(i=
0;i<
100;i++
)hash_insert
(psthashtest, i)
;hash_insert
(psthashtest,17)
;hash_insert
(psthashtest,15)
;hash_insert
(psthashtest,16)
;hash_dump
(psthashtest)
;hash_destroy
(psthashtest)
;return
;}
資料結構與演算法 雜湊表
對映在數學上相當於乙個函式f x a b。雜湊表的核心是乙個雜湊函式 hash function 這個函式規定了集合a中的元素如何對應到集合b中的元素。根據設定的雜湊函式 h key 和處理衝突的方法 將一組關鍵字映像到乙個有限的連續的位址集 區間 上,並以關鍵字在位址集中的 像 作為相應記錄在表中...
資料結構與演算法 雜湊表
雜湊表也叫雜湊表,hash表是一種根據關鍵字值 key value 而直接進行訪問的資料結構。是把記錄的儲存位置和記錄的關鍵字之間建立對應關係的一種儲存結構。雜湊表又叫 雜湊表,速度很快,最常用的一種儲存機構是順序表 鍊錶的結構 主結構是順序表,每個順序表中的元素又對應一張鍊錶。雜湊表的常用資料結構...
資料結構與演算法 雜湊表
雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。如下圖,定義了16個陣列,每個陣列用來存放一條鍊錶.在插入資料時,首先...