此部落格只有**,hash表概念等,請自行學習。此次hash中使用鍊錶為本人所寫。後續改寫此hash表,使用核心鍊錶,詳情請檢視下乙個部落格。
common.h:
#pragma once
#ifndef _common_h_
#define _common_h_
#include
#include
#include
#endif
hash.h
#pragma once
#ifndef _hash_h_
#define _hash_h_
/*此方法採用的是連位址法*/
/*為了不將hash結構暴露在外面,所以就必須typedef*/
typedef
struct hash hash_t;
//這是乙個hash函式指標,對使用者來說應該需要使用乙個合適的hash函式
//第乙個引數unsigned int指的是桶的大小 第二個引數是key值
typedef
unsigned
int(*hash_func_t)(unsigned
int,void *);
/*返回的是hash表指標,建立hash表*/
hash_t *hash_alloc(unsigned
int,hash_func_t);
void *hash_lookup_entry(hash_t *,void *,unsigned
int );
void hash_add_entry(hash_t *, void *, unsigned
int ,
void *, unsigned
int );
void hash_free_entry(hash_t *,void *,int );
#endif /*_hash_h_*/
hash.c
#include "hash.h"
#include "common.h"
//必須在前面宣告typedef
typedef
struct hash_node hash_node_t;
struct hash ;
//由於獲得桶,和得到node節點的介面並不需要外部看見,所以定義成兩個內部函式
/*根據key,得到桶*/
hash_node_t **hash_get_buckets(hash_t *hash,void *key);
/*根據key得到node節點*/
hash_node_t * hash_get_node_by_key(hash_t *hash,void *key,unsigned
int key_size);
//建立hash表
hash_t *hash_alloc(unsigned
int buckets, hash_func_t hash_func)
//判斷
void* hash_lookup_entry(hash_t *hash, void *key, unsigned
int key_size)
//新增hash節點
void hash_add_entry(hash_t *hash, void *key, unsigned
int key_size,void *data, unsigned
int data_size)
//建立節點,申請記憶體
hash_node_t *node = (hash_node_t*)malloc(sizeof(hash_node_t));
node->next = null;
node->prev = null;
node->key = malloc(key_size);
memcpy(node->key,key,key_size);
node->data = malloc(data_size);
memcpy(node->data, data, data_size);
//採用頭插法,將節點插入到hash表中
//1.首先得取到桶
hash_node_t **bucket = hash_get_buckets(hash,key);
//如果沒有節點
if (*bucket == null)
else
}//釋放節點
void hash_free_entry(hash_t *hash, void *key, int key_size)
else
if (node->next)
free(node->key);
free(node->data);
free(node);
}//根據key得到buckets號
hash_node_t **hash_get_buckets(hash_t *hash, void *key)
return &(hash->nodes[buckets]);
}//通過key值,得到node節點
hash_node_t * hash_get_node_by_key(hash_t *hash, void *key, unsigned
int key_size)
return node;
}
main.c
#include "common.h"
#include "hash.h"
typedef
struct student_t student;
//編寫hash函式
unsigned
int hash_func(unsigned
int bucktes, void *key)
int main(int argc, char *argv)
, ,,,
,};
//首先建立hash table,
hash_t *hash = hash_alloc(80, hash_func);
//將資料新增進hash table;
int size = sizeof(stu_arry) / sizeof(stu_arry[0]);
int i = 0;
for (i = 0; i < size; i++)
//查詢列印
printf("......................add end...............\n");
student *st = null;
for (i = 0; i < size; i++)
else
}for (i = 0; i < size; i++)
printf("......................free end...............\n");
for (i = 0; i < size; i++)
else
}system("pause");
return
0;}
此**在linux 與vs上均測試通過。 Hash表的實現原理
雜湊表最重要的意義就是快速定位查詢,模擬來講就是將hash表就是將程式中毫無規律的資料項組合成了 新華字典 根據 雜湊表 可以快速找到字典中的每乙個字。雜湊表目的就是為了使資料均勻分布同時保證計算簡單,花費在計算位址上的時間要遠小於遍歷的時間。1直接定址法 在雜湊之前要知道所有的關鍵值,且資料之間對...
golang實現hash表(雜湊)
使用hash原理,模擬資料庫儲存資料,直接操作記憶體編輯資料,package main import errors fmt os hash鍊錶的基本使用 思路 1 建立乙個hash結構體,裡面儲存自己自定義數量的鍊錶陣列 2 建立乙個鍊錶,用來儲存使用者資料 3 每次插入前先計算插入的哪乙個陣列,根...
hash表 hash演算法
概念 雜湊表 hash table。也叫雜湊表 是依據關鍵碼值 key value 而直接進行訪問的 資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f key 對隨意給定的keyword值ke...