即H(key)=key或H(key) = a·key + b,當中a和b爲常數(這樣的散列函數叫作自身函數)。數組
若當中H(key)中已經有值了,就往下一個找。直到H(key)中沒有值了。就放進去。數據結構
線性哈希表(採用了線性試探解決衝突問題)字體
/****************************** 線性hash表 by Rowandjj 2014/7/14 ******************************/ #include<iostream> using namespace std; #define MAX 20//hash表大小 typedef int DataType; typedef struct _NODE_ { DataType data;//方便起見,直接用int型。實際應用時應該是隨意類型的 int flag;//1表明已有數據,0表明無數據 }HashNode,*pHashNode; typedef struct _HASHTABLE_ { pHashNode pHashNodeTemp;//實際存儲數據的hash數組 int n;//hash表大小(總容量) int cur_elem;//當前容量 }HashTable,*pHashTable; int hashFunc(DataType key)//hash函數 { int index = key/3+1; index = (index < 0) ? -index : index; return index; } bool CreateHashTable(pHashTable pHashTableTemp); bool DestroyHashTable(pHashTable pHashTableTemp); void InsertHashTable(pHashTable pHashTableTemp,DataType data,int (*hashFunc)(DataType)); int StatHashTable(HashTable HashTableTemp);//統計空項 void PrintHashTable(HashTable HashTableTemp);//輸出hash表中的值 int SearchKey(HashTable HashTableTemp,DataType data,int (*hashFunc)(DataType));//依據數據查找其索引 int main() { int i; int a[] = {9,31,26,1,13,2,11}; cout<<"原始序列:"<<endl; for(i = 0; i < 7; i++) { cout<<a[i]<<" "; } cout<<endl; HashTable hashTable; CreateHashTable(&hashTable); for(i = 0; i < 7; i++) { InsertHashTable(&hashTable,a[i],hashFunc); } cout<<"散列後的序列:"<<endl; PrintHashTable(hashTable); DataType data; while(cin>>data) { if(data == -1) { break; } cout<<"index = "<<SearchKey(hashTable,data,hashFunc); } DestroyHashTable(&hashTable); return 0; } bool CreateHashTable(pHashTable pHashTableTemp) { if(!pHashTableTemp) { return false; } pHashTableTemp->pHashNodeTemp = (pHashNode)malloc(sizeof(HashNode)*MAX); if(!pHashTableTemp->pHashNodeTemp) { return false; } else { pHashTableTemp->n = MAX; pHashTableTemp->cur_elem = 0; for(int i = 0; i < pHashTableTemp->n; i++) { pHashTableTemp->pHashNodeTemp[i].flag = 0; pHashTableTemp->pHashNodeTemp[i].data = -1; } } return true; } bool DestroyHashTable(pHashTable pHashTableTemp) { if(pHashTableTemp != NULL) { free(pHashTableTemp->pHashNodeTemp); pHashTableTemp->pHashNodeTemp = NULL; pHashTableTemp->n = 0; } return true; } void InsertHashTable(pHashTable pHashTableTemp,DataType data,int (*hashFunc)(DataType)) { if(!pHashTableTemp) { return; } if(StatHashTable(*pHashTableTemp) == 0)//當hash表滿了的時候。可以選擇擴容,這裏直接返回 { cout<<"hash表已滿..."<<endl; return; } int index = hashFunc(data) - 1; while(pHashTableTemp->pHashNodeTemp[index].flag)//衝突時採用的是線性試探法 { index = (index + 1)% pHashTableTemp->n;//防止越界 } pHashTableTemp->pHashNodeTemp[index].data = data; pHashTableTemp->pHashNodeTemp[index].flag = 1; pHashTableTemp->cur_elem++; } int StatHashTable(HashTable HashTableTemp) { int i,count = 0; for(i = 0; i < HashTableTemp.n; i++) { if(HashTableTemp.pHashNodeTemp[i].flag == 0) { count++; } } return count; } void PrintHashTable(HashTable HashTableTemp) { int i; for(i = 0; i < HashTableTemp.n; i++) { cout<<HashTableTemp.pHashNodeTemp[i].data<<" "; } cout<<endl; } int SearchKey(HashTable HashTableTemp,DataType data,int (*hashFunc)(DataType)) { int index = hashFunc(data)-1; int times = 0; while(HashTableTemp.pHashNodeTemp[index].flag && HashTableTemp.pHashNodeTemp[index].data != data) { index = (index + 1)% HashTableTemp.n; times ++; if(times == HashTableTemp.n) { return -1;//沒找到 } } return index; }