哈希表

链地址法实现哈希表(散列表)的实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef enum
{
	false = 0,
	true = 1
}STATUS;
typedef struct _NODE
{
	int data;
	struct _NODE* next;
}NODE;
typedef struct _HASH_TABLE
{
	NODE* value[10];
}HASH_TABLE;

HASH_TABLE* create_hash_table()
{
	HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
	memset(pHashTbl, 0, sizeof(HASH_TABLE));

	return pHashTbl;
}

NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
{
	NODE* pNode;
	if(NULL ==  pHashTbl)
		return NULL;

	if(NULL == (pNode = pHashTbl->value[data % 10]))
		return NULL;

	while(pNode){
		if(data == pNode->data)
			return pNode;
		pNode = pNode->next;
	}
	return NULL;
}

STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
{
	NODE* pNode;
	if(NULL == pHashTbl)
		return FALSE;

	if(NULL == pHashTbl->value[data % 10]){
		pNode = (NODE*)malloc(sizeof(NODE));
		memset(pNode, 0, sizeof(NODE));
		pNode->data = data;
		pHashTbl->value[data % 10] = pNode;
		return TRUE;
	}

	if(NULL != find_data_in_hash(pHashTbl, data))
		return FALSE;

	pNode = pHashTbl->value[data % 10];
	while(NULL != pNode->next)
		pNode = pNode->next;

	pNode->next = (NODE*)malloc(sizeof(NODE));
	memset(pNode->next, 0, sizeof(NODE));
	pNode->next->data = data;
	return TRUE;
}

STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
{
	NODE* pHead;
	NODE* pNode;
	if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
		return FALSE;

	if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
		return FALSE;

	if(pNode == pHashTbl->value[data % 10]){
		pHashTbl->value[data % 10] = pNode->next;
		goto final;
	}

	pHead = pHashTbl->value[data % 10];
	while(pNode != pHead ->next)
		pHead = pHead->next;
	pHead->next = pNode->next;

final:
	free(pNode);
	return TRUE;
}
void print_hash(HASH_TABLE *pHashTb1)
{	
	int i;
	NODE* pNode;
	if(NULL == pHashTb1)
		return;
	for(i=0 ; i<10 ; i++)
	{
		pNode = pHashTb1->value[i];
		while(NULL != pNode)
		{
			printf(" %d ",pNode->data);
			pNode = pNode->next;
		}
		printf("\n");
	}
}

main()
{
	HASH_TABLE* pHashTable;
	int hb[MAXSIZE]={11,23,56,25,78,34,90,12,37,43,
					 34,12,87,80,56,76,81,92,23,88};
	pHashTable = create_hash_table();
	int i=0;
	while(i < MAXSIZE)
	{
		if(insert_data_into_hash(pHashTable,hb[i]))
		{
			printf("%d insert successed\n",hb[i]);
		}
		i++;
	}
	print_hash(pHashTable);
	if(delete_data_from_hash(pHashTable,hb[3]))
	{
		printf("%d delete successed\n",hb[3]);
		print_hash(pHashTable);
	}
	return;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值