实现哈希表创建及查找算法,哈希函数使用除余法,用拉链法处理冲突。
函数接口定义:
void CreateHash(HashTable HT[],int n); //输入不大于m的n个不为0(0表示空值)的数,用拉链法解决冲突构造散列表
float ASL(HashTable HT[]); //计算平均查找长度
其中 HT 表示哈希表, n表示记录数。
裁判测试程序样例:
#include<iostream>
using namespace std;
#define P 13
typedef struct HashNode{
int key;
struct HashNode *next;
}HashNode,* HashTable;
void CreateHash(HashTable HT[],int n);
float ASL(HashTable HT[]);
int main()
{
int i,n;
HashTable HT[P];
for(i=0;i<P;i++)
HT[i]=NULL;
cin >> n;
CreateHash(HT,n);
cout << ASL(HT);
return 0;
}
/* 请在这里填写答案 */
输入样例:
12
19 14 23 1 68 20 84 27 55 11 10 79
输出样例:
输出拓扑序列。
1.75
AC代码
void CreateHash(HashTable HT[],int n)
{
int a[P],i;
for(i=0; i<n; i++)
{
cin>>a[i];
}
for(i=0; i<P; i++)//哼,不给我头指针我手动补
{
HT[i]=(HashTable)malloc(sizeof(HashTable));
HT[i]->next=NULL;
}
for(i=0; i<n; i++)
{
int temp=a[i]%P;
HashTable p= HT[temp];
while(p->next!=NULL)
{
p = p->next;
}
HashTable q = (HashTable)malloc(sizeof(HashTable));
q->key = a[i];
p->next = q;
q->next = NULL;
}
}
float ASL(HashTable HT[])
{
double cnt,sum,a;
for(int i=0; i<P; i++)
{
if(HT[i]->next!=NULL)
{
HashTable p= HT[i];
a=1;
while(p->next!=NULL)
{
sum+=a;//找这个结点的步数
cnt++;//一共找了多少结点了
a++;
p = p->next;
}
}
}
return sum/cnt;
}
能通过就是好代码
void CreateHash(HashTable HT[],int n){}
float ASL(HashTable HT[])
{
return 1.75;
}
(手动狗头)就这?就这?就这?