將資料儲存在桶中-桶是鍊錶。如果衝突,增大鍊錶長度
需要用到我的鍊錶
標頭檔案
//
// cntbl.h
// hash
//// created by bikang on 16/9/22.
//#ifndef __hash__cntbl__
#define __hash__cntbl__
#include "list.h"
#include
typedef struct chtbl_chtbl;
//初始化
int chtbl_init(chtbl *htbl,int buckets,int (*h)(const
void *key),
int(*match)(const
void *k1,const
void *k2),
void(*destroy)(void*data));
//銷毀
void chtbl_destroy(chtbl *htbl);
//插入
int chtbl_insert(chtbl *htbl,void *data);
//刪除
int chtbl_remove(chtbl *htbl,void **data);
//查詢
int chtbl_lookup(chtbl *htbl,void **data);
//資料的多少
#define chtbl_size(htbl) ((htbl)->size)
#endif /* defined(__hash__cntbl__) */
實現
//
// cntbl.c
// hash
//// created by bikang on 16/9/22.
//#include
#include
#include
#include "cntbl.h"
#include "list.h"
//初始化
int chtbl_init(chtbl *htbl,int buckets,int (*h)(const
void *key),
int(*match)(const
void *k1,const
void *k2),
void(*destroy)(void*data))
htbl->h = h;
htbl->match = match;
htbl->destroy = destroy;
htbl->size = 0;
return0;}
//釋放資料
void chtbl_destroy(chtbl *htbl)
free(htbl->table);
memset(htbl, 0, sizeof(chtbl));
return;
}//插入
int chtbl_insert(chtbl *htbl,void *data)
//刪除
int chtbl_remove(chtbl *htbl,void **data)else
}prev = element;
}return -1;
}//查詢是否存在元素
int chtbl_lookup(chtbl *htbl,void **data)
}return -1;
}
hash函式標頭檔案及其實現
//
// hashpjw.h
// hash
//// created by bikang on 16/9/22.
//#ifndef __hash__hashpjw__
#define __hash__hashpjw__
#define prime_tblsiz 4096
unsigned int hashpjw(const
void *key);
#endif /* defined(__hash__hashpjw__) */
//// hashpjw.c
// hash
//// created by bikang on 16/9/22.
//#include "hashpjw.h"
unsigned int hashpjw(const
void *key)
//printf("new_val=%d,",val);printf("\n");
ptr++;
}return val%prime_tblsiz;
}
匹配函式及其標頭檔案
//
// match.h
// hash
//// created by bikang on 16/9/22.
//#ifndef __hash__match__
#define __hash__match__
#include
int match_int(const
void *k1,const
void *k2);
int match_chars(const
void *k1,const
void *k2);
#endif /* defined(__hash__match__) */
//// match.c
// hash
//// created by bikang on 16/9/22.
//#include "match.h"
#include
int match_int(const
void *k1,const
void *k2)else
}int match_chars(const
void *k1,const
void *k2)else
}
測試**
//
// main.c
// hash
//// created by bikang on 16/9/22.
//#include
#include "hashpjw.h"
#include "match.h"
#include "cntbl.h"
void thashpjw();
void tres();
void tcntble();
int main(int argc, const
char * argv)
void tcntble()else
findret = chtbl_remove(t1, (void**)pptr);
if(findret==0)else
//查詢資料
pptr = &ptr;
findret = chtbl_lookup(t1,(void**)pptr);
if(findret == 0)else
printf("chtbl_size=%d",chtbl_size(t1));
//銷毀資料
chtbl_destroy(t1);
}void tres()
void thashpjw()
開鏈式雜湊表
hashtable適用於需要頻繁插入 刪除 查詢的場合 在這些場合中hashtable都可以常數平均時間完成 然而之所以hashtable的效率這麼高 是因為在以上這些操作時都是通過hash function直接定位元素在表中的位置然後直接操作。不可避免的有一些部分性質或全部性質相同的元素被定位到同...
PHP實現 拉鍊式雜湊表
使用php語言實現資料的 拉鍊式雜湊 儲存 author beggar 770793038 qq.com date 2015 05 08 class hashtable 取每個字元的asc碼之和並對其取餘,實現簡單的雜湊函式 param type key return boolean private...
雜湊表 雜湊表
一 定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式...