linux c實現通用hash表

2021-08-20 14:49:03 字數 3548 閱讀 4902

此部落格只有**,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...