65,206
社区成员
发帖
与我相关
我的任务
分享
//哈希表的创建,插入,删除和查找
//哈希函数采用除留余数法
//解决冲突的方法用开放地址法中的线性探测法和拉链法
#include<iostream>
using namespace std;
typedef struct node
{
int key;
struct node* next;
}NodeType;//单链表结点类型
typedef struct
{
NodeType* firstp;//首结点指针
}HashTable;
void InsertHT(HashTable ha[], int& n, int p, int k);//将关键字插入到哈希表中
void CreateHT(HashTable ha[], int& n, int m, int p, int keys[], int n1);//创建哈希表
bool DeleteHT(HashTable ha[], int& n, int p, int k);//删除哈希表中的关键字k
void SearchHT(HashTable ha[], int p, int k);//查找关键字k
void ASL(HashTable ha[], int n, int m);//求ASL
int main()
{
int n, m;
int p = 13;
m = 13;
HashTable ha[10];
int keys[13] = {16,74,60,43,54,90,46,31,29,88,77};
CreateHT(ha, n, m, p, keys, 13);
DeleteHT(ha, n,p, 7) ? cout << "成功!" <<endl: cout << "失败" << endl;
SearchHT(ha,p, 21);
ASL(ha, n, m);
return 0;
}
void CreateHT(HashTable ha[], int& n, int m, int p, int keys[], int n1)
{
for (int i = 0; i < m; i++)
ha[i].firstp = nullptr;
n = 0;
for (int j = 0; j < n1; j++)
InsertHT(ha, n, p, keys[j]);
}
void InsertHT(HashTable ha[], int& n, int p, int k)
{
int adr = k % p;
NodeType* tmp=new NodeType;
tmp->key = k;
tmp->next = nullptr;
if (ha[adr].firstp == nullptr)
ha[adr].firstp = tmp;
else
{
tmp->next = ha[adr].firstp;
ha[adr].firstp = tmp;
}
n++;
}
bool DeleteHT(HashTable ha[], int& n, int p, int k)
{
int adr = k % p;
NodeType* q = ha[adr].firstp,*pre;
if (!q)
return false;
if (q->key == k)
{
ha[adr].firstp = q->next;
delete q;
n--;
return true;
}
pre = q; q = q->next;
while (q != nullptr && q->key != k)
{
pre = q;
q = q->next;
}
if (q == nullptr)
return false;
else
{
pre->next = q->next;
delete q;
n--;
return true;
}
}
void SearchHT(HashTable ha[], int p, int k)
{
int adr = k % p;
NodeType* ptr = ha[adr].firstp;
int i = 0;
while (ptr != nullptr && ptr->key != k)
{
ptr = ptr->next;
i++;
}
if (ptr == nullptr)
cout << "失败:" << "关键字" << k << "比较" << i << "次" << endl;
else
cout << "失败:" << "关键字" << k << "比较" << i << "次" << endl;
}
void ASL(HashTable ha[], int n, int m)
{
NodeType* p;
int succ = 0, unsucc = 0;
int s;
for (int i = 0; i < m; i++)
{
s = 0;
p = ha[i].firstp;
while (p != nullptr)
{
s++;
p = p->next;
succ += s;
}
unsucc += s;
}
cout << "成功ASL=" << succ * 1.0 / n << endl;
cout << "不成功ASL=" << unsucc * 1.0 / m << endl;
}