ハッシュ・テーブルの基本操作(完全なコード)

4546 ワード

表とツリーのソートは、要素間の関係を利用して、1つずつ検索したり、一定の法則で検索したりします.一方、ハッシュ・テーブル(ハッシュ・テーブル)は、要素間には関係なく、要素とストレージ・アドレスの関係を利用しています.はっきり言って、ハッシュ関数を利用して要素->アドレスのマッピングを確立して、それから私たちが確立した構造体の中で、配列を利用してアドレス->要素の関係を格納して、データを来て、ハッシュ関数で彼のアドレスを計算して、それから配列の中でこの要素かどうかを見て、見つけて、そうでなければバイバイしました.もちろん、ここにはアドレスの衝突の問題があります.小さな詳細です.
#include
#include

#define SUCCESS 1
#define UNSUCCESS 0
#define HASHSIZE 12
#define NULLKEY -32768

int m=0;

typedef struct
{
    int *elem;      //      ,        
    int count;      //      
}HashTable;

//   
int InitHashTable(HashTable *H)
{
    int i;
    m=HASHSIZE;
    H->count=m;
    H->elem=(int*)malloc(m*sizeof(int));        //    
    for(i=0;ielem[i]=NULLKEY;
    return SUCCESS;
}

//    
int Hash(int key)
{
    return key%m;
}

//  
void InsertHash(HashTable *H,int key)
{
    int addr=Hash(key);
    while(H->elem[addr]!=NULLKEY)       //      ,   
        addr=(addr+1)%m;        //    :          
    H->elem[addr]=key;
}

//  
int SearchHash(HashTable H,int key,int *addr)
{
    *addr=Hash(key);        //      
    while(H.elem[*addr]!=key)       //      ,   
    {
        *addr=(*addr+1)%m;      //    
        if(H.elem[*addr]==NULLKEY || *addr==Hash(key))      //       ,        
            return UNSUCCESS;
    }
    return SUCCESS;
}

void main()
{
    HashTable H;
    int i,key;
    int addr;
    InitHashTable(&H);
    int a[12]={12,67,56,16,25,37,22,29,15,47,48,34};
    for(i=0;i<12;i++)
    {
        InsertHash(&H,a[i]);
    }
    printf("          :");
    scanf("%d",&key);
    if(SearchHash(H,key,&addr))
        printf("   ");
    else
        printf("sorry,  !");
}

以上は最も基本的なコードで、『大話データ構造』を読むときに本のコードに基づいて書いたもので、最も基礎的な人に適しています.