simple_hash_list
来源:互联网 发布:华为云计算怎么样 编辑:程序博客网 时间:2024/04/30 05:56
#ifndef _SIMPLE_HASH_TABLE_ #define _SIMPLE_HASH_TABLE_ typedef struct _hashnode { int m_index; struct _hashnode* m_link;} hashnode_t; typedef int (* hashfunc_t) (int node); typedef struct _hashtable { hashfunc_t m_func; hashnode_t** m_data; int m_len;} hashtable_t; hashnode_t* hashtable_find (hashtable_t* tab, int index);void hashtable_init (hashtable_t** tab, hashfunc_t func, int len);void hashtable_insert (hashtable_t* tab, hashnode_t* node);void hashtable_remove (hashtable_t* tab, int node);void hashtable_display (hashtable_t* tab);void hashtable_destroy (hashtable_t** tab); #endif
#include "simpleht.h"#include <malloc.h>#include <stdio.h>#include <stdlib.h>#include <assert.h> void hashtable_init (hashtable_t** tab, hashfunc_t func, int len) { int i = 0; *tab = (hashtable_t*)malloc(sizeof(hashtable_t*)); (*tab)->m_data = (hashnode_t**)malloc(sizeof(hashnode_t*)*len); (*tab)->m_func = func; (*tab)->m_len = len; for (i = 0; i < len; ++i) { (*tab)->m_data[i] = 0; }} void hashtable_insert (hashtable_t* tab, hashnode_t* node) { int hashnum; hashnode_t **tail; hashnum = tab->m_func (node->m_index); tail = &tab->m_data[hashnum]; while (*tail) { tail = &(*tail)->m_link; } *tail = node;} void hashtable_remove (hashtable_t* tab, int nodeindex) { int hashnum; hashnode_t **tail, *tmp; hashnum = tab->m_func (nodeindex); tail = &tab->m_data[hashnum]; while (*tail) { if ((*tail)->m_index == nodeindex) { tmp = *tail; break; } *tail = (*tail)->m_link; } if (tmp) { *tail = (*tail)->m_link; free (tmp); }} void hashtable_display (hashtable_t* tab) { int i; hashnode_t* cusor; for (i = 0; i < tab->m_len; ++i) { printf ("%d : ", i); cusor = tab->m_data[i]; while (cusor) { printf ("%d ", cusor->m_index); cusor = cusor->m_link; } printf ("n"); }} void hashtable_destroy (hashtable_t* tab) { int i; hashnode_t** cusor, *tmp; for (i = 0; i < tab->m_len; ++i) { cusor = &tab->m_data[i]; while (*cusor) { tmp = *cusor; *cusor = (*cusor)->m_link; free (tmp); } } free (tab->m_data);} hashnode_t* hashtable_find (hashtable_t* tab, int index) { int hashnum; hashnode_t* cusor; hashnum = tab->m_func (index); cusor = tab->m_data[hashnum]; while (cusor) { if (cusor->m_index == index) { return cusor; } cusor = cusor->m_link; } return 0;} int hashfunc (int index) { return index % 10;} int main () { hashtable_t* table = 0; hashtable_init (&table, hashfunc, 10); for (int i = 0; i < 100; ++i) { hashnode_t* node = (hashnode_t*) malloc(sizeof(hashnode_t)); node->m_index = rand() % 1000; node->m_link = 0; hashtable_insert (table, node); } hashtable_display (table); hashtable_destroy (table); return 0;}
输出结果: