簡單雜湊表實現
阿新 • • 發佈:2019-02-15
雜湊表定義:
雜湊表又稱散列表,是根據關鍵碼值(key value)而直接訪問的資料結構。它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。
雜湊表既有陣列的特點(定址容易),又有連結串列的特點(方便插入,刪除)。
雜湊表結構示意圖:
下面編寫一個簡單例項:
1.頭的定義: typedef struct HSStruct { int data ; struct HSStruct* prev; struct HSStruct* next; int hash; } MyHash;
#define HASH_SIZE 64
MyHash* hashArr[HASH_SIZE];
/*雜湊函式定義,產生Key值*/
unsigned int hash_key( MyHash* h)
{
return (h->data % HASH_SIZE );
}
/* 資料新增 1.判斷新增的資料儲存的指標是否有MyHash資料 2.在連結串列按照小到大新增 */ void l_add(MyHash* h) { int index = h->hash; MyHash* h2; MyHash* h2prev; h2 = hashArr[index]; if ( h2 == (MyHash*) 0 )//在h指標不存在MyHash資料 { /* The list is empty. */ hashArr[index] = h; h->prev = h->next = (MyHash*) 0; }else{ if(h->data < h2->data) { hashArr[index] = h ; h->prev = (MyHash*) 0 ; h->next = h2 ; h2->prev = h ; }else { for(h2prev = h2,h2 = h2->next ; h2 != (MyHash*) 0 ; h2prev = h2,h2 = h2->next) { if(h->data < h2->data) { h2prev->next = h ; h->prev = h2prev ; h->next = h2 ; h2->prev = h ; } } h2prev->next = h; h->prev = h2prev; h->next = (MyHash*) 0; } } }
/* 刪除資料 1.先判斷,並刪除第一個資料 2.判斷,並刪除中間位置(非頭)資料 3.判斷非尾部資料,並進行指標連線 */ void l_remove(MyHash* h) { int index = h->hash; if ( h->prev == (MyHash*) 0 ) hashArr[h] = h->next; else h->prev->next =h->next; if ( h->next != (MyHash*) 0 ) h->next->prev = h->prev; }
都是我學習的過程,如有錯誤,多多指教。