哈希表定义:
哈希表又称散列表,是根据关键码值(key value)而直接访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
哈希表既有数组的特点(寻址容易),又有链表的特点(方便插入,删除)。
哈希表结构示意图:
下面编写一个简单实例:
1.头的定义:
typedef struct HSStruct {
int data ;
struct HSStruct* prev;
struct HSStruct* next;
int hash;
} MyHash;
#define HASH_SIZE 64
MyHash* hashArr[HASH_SIZE];
/*散列函数定义,产生Key值*/
unsigned int hash_key( MyHash* h)
{
return (h->data % HASH_SIZE );
}
/*
数据添加
1.判断添加的数据保存的指标是否有MyHash数据
2.在链表按照小到大添加
*/
void l_add(MyHash* h)
{
int index = h->hash;
MyHash* h2;
MyHash* h2prev;
h2 = hashArr[index];
if ( h2 == (MyHash*) 0 )//在h指标不存在MyHash数据
{
/* The list is empty. */
hashArr[index] = h;
h->prev = h->next = (MyHash*) 0;
}else{
if(h->data < h2->data)
{
hashArr[index] = h ;
h->prev = (MyHash*) 0 ;
h->next = h2 ;
h2->prev = h ;
}else
{
for(h2prev = h2,h2 = h2->next ; h2 != (MyHash*) 0 ; h2prev = h2,h2 = h2->next)
{
if(h->data < h2->data)
{
h2prev->next = h ;
h->prev = h2prev ;
h->next = h2 ;
h2->prev = h ;
}
}
h2prev->next = h;
h->prev = h2prev;
h->next = (MyHash*) 0;
}
}
}
/*
删除数据
1.先判断,并删除第一个数据
2.判断,并删除中间位置(非头)数据
3.判断非尾部数据,并进行指针连接
*/
void l_remove(MyHash* h)
{
int index = h->hash;
if ( h->prev == (MyHash*) 0 )
hashArr[h] = h->next;
else
h->prev->next =h->next;
if ( h->next != (MyHash*) 0 )
h->next->prev = h->prev;
}
都是我学习的过程,如有错误,多多指教。