建立Hash表(散列表)(运用线性探测法解决冲突)

来源:互联网 发布:2017最新淘宝黑车技术 编辑:程序博客网 时间:2024/05/16 02:00
//根据用户输入的表长度、散列函数的模、以及若干个健值(个数小于表长度, 有效关键字不为0)建立Hash表
//使用线性探测法解决冲突 


#include<iostream>
using namespace std;


const int NULLKEY = 0;


const int ENDFLAG = 0;


const int TableSize = 16;


const int mod = 13;


typedef int KeyType;


typedef char InfoType;


typedef struct
{
KeyType key;
InfoType otherinfo;
}HashTable;


int H(KeyType key);//散列函数 


void CreateHashTable(HashTable[]);//使用顺序存储结构建立散列表 


void OutputHashTable(HashTable[]);//输出散列表


int SearchHash(HashTable[], KeyType key);//在散列表中查找关键字为key的结点 


int main()
{
HashTable HT[TableSize];

for(int i=0; i<TableSize; i++)//将散列表每个结点的key分量初始化为NULLKEY
 HT[i].key = NULLKEY;

KeyType key;

int res;

CreateHashTable(HT);

OutputHashTable(HT);

cout << "Input the key you want to search: " ;

cin >> key;

while (key!=ENDFLAG)//直到读入的是ENDFLAG(0),循环退出 
{
res = SearchHash(HT, key);

if (res==-1)
 cout << "Not find the key " << key << endl;
else 
 cout << "Find the key " << key << ", position = " << res << endl;
 
cout << "Input the key you want to search: " ;//继续读入下一个要查找的key
cin >> key;
}

return 0;
}


int H(KeyType key)//散列函数 
{
return key%mod ;
}


void CreateHashTable(HashTable HT[])
{//使用顺序存储结构建立散列表
int pos;

KeyType key;

cout << "Input your keys: " ;
cin >> key;

while (key!=ENDFLAG)//直到读入的是ENDFLAG(0),循环退出
{
pos = H(key) ;//根据散列函数计算散列地址 

   for(int i=0; i<TableSize; i++)
   {    
    if ( HT[pos].key==NULLKEY ) //当前散列地址的key值为空 
       {
   HT[pos].key = key; //将key值写入当前散列地址 
   break;
       }
       pos = (pos+1)%TableSize ; //当前散列地址非空,使用线性探测法计算下一个散列地址
        }
     
   cin >> key;//继续读入下一个要写入的key 
    }
}

void OutputHashTable(HashTable HT[])
{
for(int i=0; i<TableSize; i++)
cout << "关键字:" << HT[i].key << ", 地址:" << i << endl; 
}


int SearchHash(HashTable HT[], KeyType key)
{//在散列表中查找关键字为key的结点 


int pos = H(key) ;//根据散列函数计算散列地址

for(int i=0; i<TableSize; i++)
{
  if(HT[pos].key==key)//当前散列地址的key值就是要查找的key值 
    return pos ;
  if(HT[pos].key==NULLKEY)//当前散列地址的key值为空 
    return -1;
    
  pos = (pos + 1) % TableSize;//当前散列地址非空且不是要查找的key值,使用线性探测法计算下一个查找地址
    }
}

阅读全文
0 0
原创粉丝点击