简单哈希表实现

哈希表定义:

    哈希表又称散列表,是根据关键码值(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;
}


都是我学习的过程,如有错误,多多指教。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值