简单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));
}



 

静态链表初始化及相关操作

  • qq_28930109
  • qq_28930109
  • 2016年11月22日 19:50
  • 375

哈希链表及其变种

本文主要分析哈希链表(hash list)的设计原理和实现,以及哈希链表的一种变种(hash nulls list)的原理和实现。...
  • zhangskd
  • zhangskd
  • 2013年09月09日 18:34
  • 9585

数组、链表、Hash

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

数组、链表、哈希表

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

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

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

简单hash就是数组加链表

简单的hash就是用数组加链表的组合来实现,这种hash很简单,但hash的思想在那。     贴出代码: hash.h: #ifndef _HASH_H_ #define _HASH_H_ ...
  • dndxhej
  • dndxhej
  • 2012年03月26日 21:56
  • 3165

数组与链表的优缺点

数组,在内存上给出了连续的空间.链表,内存地址上可以是不连续的,每个链表的节点包括原来的内存和下一个节点的信息(单向的一个,双向链表的话,会有两个).  数组优于链表的:  1.内存空间占用的少,因...
  • u014082714
  • u014082714
  • 2015年03月14日 14:05
  • 13444

HashMap中关于数组和链表的一些认识

HashMap底层是通过顺序表(数组)+ 链表实现的,数组中存放的是对象 (1)数组部分进行的操作主要是散列,根据hash算法进行散列,实现快速存储第一步,确定存储在数组的哪个位置。 hash算法...
  • qq_31547675
  • qq_31547675
  • 2017年06月06日 21:01
  • 648

数组、链表、Hash的优缺点

IOS笔试题总结(数组、链表、Hash的优缺点) 转载2016-04-22 17:08:33 数组、链表、Hash的优缺点: 1、数组是将元素在内存中连续存放。  ...
  • u010742414
  • u010742414
  • 2017年10月17日 11:44
  • 309

数组和链表的区别

数组和链表是两种基本的数据结构,他们在内存存储上的表现不一样,所以也有各自的特点。大致总结一下特点和区别,拿几个人一起去看电影时坐座位为例。数组的特点 在内存中,数组是一块连续的区域。 拿上面的看电影...
  • qq_25806863
  • qq_25806863
  • 2017年04月24日 16:57
  • 707
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单hash就是数组加链表
举报原因:
原因补充:

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