1. 程式人生 > >簡單雜湊表實現

簡單雜湊表實現

雜湊表定義:

    雜湊表又稱散列表,是根據關鍵碼值(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;
}


都是我學習的過程,如有錯誤,多多指教。