标签:des style blog http 使用 strong
线性哈希表(采用了线性试探解决冲突问题)
/****************************** 线性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; }
标签:des style blog http 使用 strong
原文地址:http://blog.csdn.net/chdjj/article/details/37761263