简单hash就是数组加链表

原创 2012年03月26日 21:56:41

    简单的hash就是用数组加链表的组合来实现,这种hash很简单,但hash的思想在那。

    贴出代码:

hash.h:

#ifndef _HASH_H_
#define _HASH_H_

typedef struct _ListNode
{
	struct _ListNode *prev;
	struct _ListNode *next;
	void *data;
}ListNode;

typedef ListNode *List;
typedef ListNode *Position;

typedef struct _HashTbl
{
	int TableSize;
	List *Thelists;
}HashTbl;

int Hash( void *key, int TableSize );
HashTbl *InitHash( int TableSize );
void Insert( void *key, HashTbl *HashTable );
Position Find( void *key, HashTbl *HashTable );
void Destory( HashTbl *HashTable );
void *Retrieve( Position P );



#endif


hash.c:

#include <stdio.h>
#include <stdlib.h>
#include "hash.h"

int Hash( void *key, int TableSize )
{
	char c;
	int i;
	int hval = 0;

	for( i = 1;(c = *(char *)key++) != 0; i++)
		hval += c*i;
	return (hval%TableSize);
}

HashTbl *InitHash( int TableSize )
{
	int i;
	HashTbl *HashTable;
	HashTable = malloc(sizeof(HashTbl));
	if( NULL == HashTable )
	{
		printf("HashTable malloc error\n");
		return;
	}

	HashTable->TableSize = TableSize;
	
	HashTable->Thelists = malloc(sizeof(List)*TableSize);
	if( NULL == HashTable->Thelists )
	{
		printf("HashTable malloc error\n");
		return;
	}

	for( i = 0; i < TableSize; i++)
	{
		HashTable->Thelists[i] = malloc(sizeof(ListNode));
		if( NULL == HashTable->Thelists[i] )
		{
			printf("HashTable malloc error\n");
			return;
		}
		else
		{
			HashTable->Thelists[i]->next = NULL;
			HashTable->Thelists[i]->prev = NULL;
		}	
	}

	return HashTable;
}

Position Find( void *key, HashTbl *HashTable )
{
	int i,j;
	List L;
	Position P;
	i = Hash(key,HashTable->TableSize);
	L = HashTable->Thelists[i];
	P = L->next;
	while( P != NULL && P->data != key )
		P = P->next;

	return P;
}

void Insert( void *key, HashTbl *HashTable )
{
	Position P,tmp;
	List L;
	P = Find(key,HashTable);
	
	if( NULL == P )
	{
		tmp = malloc(sizeof(ListNode));
		if( NULL == tmp )
		{
			printf("malloc error\n");
			return;
		}
		L = HashTable->Thelists[Hash(key,HashTable->TableSize)];
		tmp->data = key;
		tmp->next = L->next;
		if(L->next != NULL)
			L->next->prev = tmp;
		tmp->prev = L;
		L->next = tmp;
	}
	else
		printf("the key already exist\n");
}

void *Retrieve( Position P )
{
	return P->data;
}

void Destory( HashTbl *HashTable )
{
	int i;
	List L;
	Position tmp,tmp2;
	for( i = 0; i < HashTable->TableSize; i++)
	{
		L = HashTable->Thelists[i];
		tmp = L->next;
		while(tmp->next != NULL)
		{
			tmp2 = tmp->next;
			free(tmp);
			tmp = tmp2;
		}
		free(L);
	}
	free(HashTable);
}

void main( void )
{
	HashTbl *HashTable;
	HashTable = InitHash(31);
	Insert("a",HashTable);
	Insert("b",HashTable);	
	Insert("b",HashTable);
	Position P;
	P = Find("a",HashTable);
	printf("%s\n",Retrieve(P));
}



 

相关文章推荐

数组、链表、哈希表

http://bbs.csdn.net/topics/390669143 上体育课的时候,老师说:你们站一队,每个人记住自己是第几个,我喊到几,那个人就举手,这就是数组。 老是说,你们每个人记住...

数组、链表、Hash

QQ数据结构J#        在程序中,存放指定的数据最常用的数据结构有两种:数组和链表。       数组和链表的区别:       1、数组是将元素在内存中连续存放。 ...

数据结构:数组+链表(巧妙!)

数组+链表这种数据结构在《HashMap源码分析 》一文中以及在之前分析Linux内核源码的过程中多次碰到,本篇文章专门探讨这种数据结构。 数组与链表各自的优缺点大家肯定都很熟悉了,而数组+链表这种数...
  • cumtwyc
  • cumtwyc
  • 2016年07月18日 19:12
  • 3156

从数组、链表到集合

一、数组概念使用连续的一块内存空间保存,长度在初始化时确定。时间复杂度访问第n个元素时,时间复杂度为O(1);当访问某个特定的元素时,时间复杂度为O(n); 怎么理解这两个时间复杂度不一致的...

数据结构与算法-“数组、链表、树、哈希表”选哪个

数据结构与算法-“数组、链表、树、哈希表”选哪个(性能比较)? 通用数据结构貌似包括:数组、链表、树(二叉树、平衡树)、哈希表。之所以称之为通用数据结构是因为它们通过关键字的值来存储、查找数据。 现实...

利用数组和链表实现简单的哈希表

/** * 利用数组和链表实现简单的哈希表 * @author xxxu * */ public class HashTable { //哈希表的大小 private int m=0; ...

RPC实践(一)起步从非RPC的RMI开始

在工作中使用java编写服务的同学都有用过或者知道RMI,从RMI和RPC解决问题的出发点看,有一些是相同的,所以有相似之处,都提供了一种远程调用接口的能力,解决了分布式系统中相互之间调用的问题。不过...
  • csolo
  • csolo
  • 2016年12月05日 17:13
  • 407

JAVA常用的JSON处理库,常用处理方法

SON-LIB库处理json JSON-LIB依赖包 package cn.wangyuan.util; import java.util.HashMap; import java....

java-栈、队列、数组、链表、Hash、树以及集合(一)

引言 在这里主要介绍一些比较重要的算法:栈、队列、数组、链表、Hash、树以及集合的概念 栈:先进后出 队列:先进先出,横向队列,存入取出 有关栈和队列的具体存储数据的过程,可以通过有关图片进...
  • sliencr
  • sliencr
  • 2017年05月03日 22:09
  • 262

数组 链表 散列(hash)

hash 哈希, 散列当我们对数据进行处理的时候, 需要快速查找 ,删除,增加。在我们学习 c 语言基础的的时候, 接触到了 数组和链表:我们知道 数组 查找起来 相比较容易一些,但是做 删除和...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单hash就是数组加链表
举报原因:
原因补充:

(最多只允许输入30个字)