链地址法实现哈希表(散列表)的实现代码:
#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;
}