简单hash就是数组加链表

简单的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
• 2016年11月22日 19:50
• 375

哈希链表及其变种

• zhangskd
• 2013年09月09日 18:34
• 9585

数组、链表、Hash

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

数组、链表、哈希表

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

数据结构：数组+链表（巧妙！）

• cumtwyc
• 2016年07月18日 19:12
• 4388

简单hash就是数组加链表

• dndxhej
• 2012年03月26日 21:56
• 3165

数组与链表的优缺点

• u014082714
• 2015年03月14日 14:05
• 13444

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

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

数组、链表、Hash的优缺点

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

数组和链表的区别

• qq_25806863
• 2017年04月24日 16:57
• 707

举报原因： 您举报文章：简单hash就是数组加链表 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)