/************************************************************************
c HASH 、 、 、 、 , , ! ,
!!!
:
Email:[email protected]
Thanks!
************************************************************************/
#include <stdio.h>
#include <STDLIB.H>
#include <MEMORY.H>
#define STATUS int
#define FALSE 0
#define TRUE 1
#define VOID void
/****************************************
a) hash
*****************************************/
typedef struct _Node
{
int data;
struct _Node *next;
}NODE;
typedef struct _HASH_TABLE
{
NODE * value[10];
}HASH_TABLE;
/****************************************
b) hash
*****************************************/
HASH_TABLE * create_hash_table()
{
HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
memset(pHashTbl,0,sizeof(HASH_TABLE));
return pHashTbl;
}
/****************************************
c) hash
*****************************************/
NODE * find_data_in_hash(HASH_TABLE* pHashTbl,int data)
{
NODE* pNode;
if (NULL == pHashTbl)
{
return NULL;
}
/* HASH , NULL NULL*/
if (NULL == (pNode = pHashTbl->value[data%10]))
{
return NULL;
}
/* */
while(pNode)
{
if ( data == pNode->data)
{
/* */
return pNode;
}
/* , */
pNode = pNode->next;
}
/* NULL, */
//return NULL;
}
/****************************************
d) hash
*****************************************/
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(pNode->next)
{
pNode = pNode->next;
}
pNode->next = (NODE*)malloc(sizeof(NODE));
memset(pNode->next,0,sizeof(NODE));
pNode->next->data = data;
return TRUE;
}
/****************************************
e) hash
*****************************************/
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;
}
/****************************************
f) hash
:
[Hash idx] [value]
0-------------NULL
1-------------1 251
2-------------22
3-------------123 43
4-------------NULL
5-------------55 15 235 525 725 275 545
6-------------NULL
7-------------257
8-------------NULL
*****************************************/
VOID print_hash_data(HASH_TABLE* pHashTbl)
{
NODE* pNode;
int i=0;
if (NULL == pHashTbl)
{
printf("ERROR:The hash is NULL
");
}
/*
if (NULL == (pNode = pHashTbl->value[10]))
{
printf("ERROR:The hash node is NULL
");
}
*/
printf("[Hash idx] [value]
");
do
{
printf(" %d-------------",i);
if (NULL == pHashTbl->value[i])
{
i++;
printf("NULL
");
continue;
}
pNode = pHashTbl->value[i];
while(pNode)
{
printf("%d ",pNode->data);
pNode = pNode->next;
}
printf("
");
i++;
} while (i<10);
printf("
");
}
int main()
{
HASH_TABLE* pHashTbl = create_hash_table();
(VOID)insert_data_into_hash(pHashTbl,22);
(VOID)insert_data_into_hash(pHashTbl,22);
(VOID)insert_data_into_hash(pHashTbl,123);
(VOID)insert_data_into_hash(pHashTbl,436);
(VOID)insert_data_into_hash(pHashTbl,55);
(VOID)insert_data_into_hash(pHashTbl,157);
(VOID)insert_data_into_hash(pHashTbl,235);
(VOID)insert_data_into_hash(pHashTbl,256);
(VOID)insert_data_into_hash(pHashTbl,525);
(VOID)insert_data_into_hash(pHashTbl,724);
(VOID)insert_data_into_hash(pHashTbl,278);
(VOID)insert_data_into_hash(pHashTbl,209);
(VOID)insert_data_into_hash(pHashTbl,67);
(VOID)insert_data_into_hash(pHashTbl,54);
(VOID)insert_data_into_hash(pHashTbl,546);
(VOID)insert_data_into_hash(pHashTbl,350);
(VOID)insert_data_into_hash(pHashTbl,101);
(VOID)insert_data_into_hash(pHashTbl,23);
print_hash_data(pHashTbl);
(VOID)delete_data_from_hash(pHashTbl,55);
print_hash_data(pHashTbl);
return 0;
}