哈希表

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

typedef struct   //哈希
{
    int key;  //哈希地址關鍵字
    int hi;    //哈希衝突次數
}DataType;

typedef struct  
{
    DataType *data;
    int tableSize;     //哈希長度
    int curSize;       //關鍵字長度
}HashTable;


//創建哈希表,m爲哈希長度,p爲用於取模,hash[]處理的數組,n爲關鍵字長度
void CreateHashTable(HashTable *H,int m,int p,int hash[],int n)
{
    int i,addr;
    int sum=0;
    
    (*H).data = (DataType*)malloc(sizeof(DataType));
    if ( !(*H).data )
    {
        exit(-1);
    }
    
    for ( i=0 ; i<m ; i++ )  //初始化數組,未訪問的關鍵字爲-1,衝突次數爲0
    {
        (*H).data[i].key = -1;
        (*H).data[i].hi = 0;
    }
    
    for ( i=0 ; i<m ; i++ )   //哈希地址映射過程
    {
        addr = hash[i]%p;
        
        if ( (*H).data[addr].key == -1 )  //關鍵字爲訪問過
        {
            (*H).data[addr].key = hash[i];
            (*H).data[addr].hi = 0;
        }
        else   //訪問過利用線性在哈希分地址
        {
            do
            {
                addr = (addr+1)%m;
                sum++;
            }while ( (*H).data[addr].key != -1 );
            (*H).data[addr].key = hash[i];
            (*H).data[addr].hi = sum+1;
        }
    }
    (*H).tableSize = m;
    (*H).curSize = n;
    
}


void DisplayHashTable(HashTable H,int m)  //輸出哈希表
{
    int i;
    
    printf("輸出哈希地址:\n");
    for ( i=0 ; i<m ; i++ )
    {
        printf("%-5d",i);
    }
    printf("\n");
    
    printf("輸出關鍵字:\n");
    for ( i=0 ; i<m ; i++ )
    {
        printf("%-5d",H.data[i].key);
    }
    printf("\n");
    
    printf("輸出衝突次數:\n");
    for ( i=0 ; i<m ; i++ )
    {
        printf("%-5d",H.data[i].hi);
    }
    printf("\n");
}


int SearchKey(HashTable H,int k)   //關鍵字查找
{
    int d,d1,m;
    
    m = H.tableSize;
    d = d1 = k%m;
    
    while ( H.data[d].key != -1 )
    {
        if ( H.data[d].key == k )
        {
            return d;
        }
        else
        {
            d = (d+1)%m;
        }
        
        if ( d == d1 )
        {
            return -1;
        }
    }
    return -1;
}


int main(void)
{
   
    int hash[]={23,99,13,16,76,97,0,6};
    int m=8,p=8,n=8;
    int k,pos;

    HashTable H;
    CreateHashTable(&H,m,p,hash,n);
    
    DisplayHashTable(H,m);
    
    k=99;
    pos = SearchKey(H,k);
    
    printf("%d在哈希表中的關鍵字地址是:%d\n",k,pos);


    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章