数据结构实验(C++)
PS:仅数据结构实验记录
题目:使用哈希函数:H(K)=3K MOD 11, 并采用链地址法处理冲突。试对关键字序列(22,41,53,46,30,13,01,67) 构造哈希表,设计构造哈希表的完整算法。
#include<iostream>
using namespace std;
template<typename DataType>
struct Node
{
DataType data;
Node* next;
};
const int MaxSize = 11;
class Hash
{
public:
Hash(); //构造函数,初始化开散列表
~Hash(); //析构函数,释放同义词子表结点
int Insert(int k); //插入
int Delete(int k); //删除
void Print();
private:
int H(int k); //散列函数
Node<int>* ht[MaxSize]; //开散列表
};
//构造函数,初始化开散列表
Hash::Hash()
{
for (int i = 0; i < MaxSize; i++)
{
ht[i] = nullptr;
}
}
//析构函数
Hash :: ~Hash()
{
Node<int>* p = nullptr, * q = nullptr;
for (int i = 0; i < MaxSize; i++)
{
p = q = ht[i];
while (p != nullptr)
{
p = p->next;
delete q;
q = p;
}
}
}
//散列函数
int Hash::H(int k)
{
return 3*k % 11;
}
void Hash::Print()
{
Node<int>* p = nullptr;
for (int i = 0; i < MaxSize; i++)
{
p = ht[i];
while (p != nullptr)
{
cout << p->data << "\t ";
p = p->next;
}
cout << endl;
}
}
int Hash::Insert(int k)
{
int j = H(k); //计算散列地址
Node<int>* p = Search(k);
if (p != nullptr)
return -1; //已存在元素k,无法插入
else {
p = new Node<int>; p->data = k;
p->next = ht[j];
ht[j] = p;
return 1; //插入成功标志
}
}
//测试
int main()
{
int i, r[8] = { 22,41,53,46,30,13,01,67 };
Hash HT{ };
for (i = 0; i < 8; i++)
HT.Insert(r[i]);
HT.Print();
return 0;
}
测试结果