哈希表(分离链接法)

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;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值