hash.h
#ifndef _Hash_H
#define ElementType int
struct HashTal;
struct ListNode;
typedef struct HashTal * HashTable;
typedef struct ListNode * Position;
typedef Position List;
HashTable initializeTable( int TableSize );
void DestoryTable( HashTable H );
Position Find( ElementType X, HashTable H );
void Insert( ElementType X, HashTable H );
int Hash( int Key, int Size);
#endif
hash.c
#include "hash.h"
#include <stdio.h>
#include <malloc.h>
#define Table_Size 10
struct HashTal
{
int TableSize;
List * TheLists;
};
struct ListNode
{
ElementType Element;
Position Next;
};
HashTable
initializeTable( int TableSize )
{
HashTable H;
H = ( HashTable )malloc( sizeof(struct HashTal ) );
if( H == NULL )
{
printf(" malloc error ");
return;
}
H->TableSize = TableSize;
H->TheLists = (List *) malloc( sizeof( List ) * H->TableSize );
if( H->TheLists == NULL )
{
printf(" malloc error ");
return ;
}
int i;
for( i = 0; i < H->TableSize; i++ )
{
H->TheLists[i] = (Position) malloc( sizeof( struct ListNode ) );
if( H->TheLists[i] == NULL )
{
printf(" malloc error ");
return ;
}
H->TheLists[i]->Next = NULL;
}
return H;
}
void
DestoryTable( HashTable H )
{
int i;
for( i = 0; i < H->TableSize; i++ )
{
free( H->TheLists[i] );
}
free( H->TheLists );
free( H );
}
Position
Find( ElementType X, HashTable H )
{
Position P;
List L;
L = H->TheLists[ Hash( X, H->TableSize ) ];
P = L->Next;
while( (P != NULL) && (P->Element != X) )
P = P->Next;
return P;
}
void
Insert( ElementType X, HashTable H )
{
Position P, TmpCell;
if( Find(X, H) == NULL )
{
P = H->TheLists[ Hash( X, H->TableSize ) ];
TmpCell = (Position) malloc ( sizeof( struct ListNode ) );
if( TmpCell == NULL )
{
printf(" malloc error ");
return;
}
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
}
int
Hash( int Key, int Size )
{
return Key%Size;
}
void
Print( HashTable H )
{
int i;
Position P;
for( i = 0; i < H->TableSize; i++ )
{
P = H->TheLists[i];
if( P->Next == NULL )
{
continue;
}
P = P->Next;
while( P != NULL )
{
printf("%d ", P->Element);
P = P->Next;
}
}
}
int
main()
{
HashTable H;
H = initializeTable( Table_Size );
int i;
for( i = 9; i >=0; i-- )
Insert( i*i, H );
Position P;
P = Find( 81, H );
printf("%d \n", P->Element);
Print(H);
printf("\n");
DestoryTable(H);
return 0;
}