ハッシュ・テーブルの基本操作(完全なコード)
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, !");
}
以上は最も基本的なコードで、『大話データ構造』を読むときに本のコードに基づいて書いたもので、最も基礎的な人に適しています.