#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
int a[1000]={0};//全局数组初始化为0
enum EntryType{Legitimate,Empty,Deleted};
struct HashEntry{
int Data;
enum EntryType Info;
};
struct HashTable{
int TableSize;
struct HashEntry *Cells;
};
int findprime(int n){//找到大于n的素数
int i,j,k;
while(n++){
j=1;
k=sqrt(n);
for(i=2;i<=k;i++){
if(n%i==0){
j=0;
break;
}
}
if(j==1)
break;
}
printf("%d\n",n);//输出表的TableSize的大小,判断找的素数是否正确
return n;
};
struct HashTable *CreateTable(int k){
struct HashTable *H;
int i;
H=(struct HashTable *)malloc(sizeof(struct HashTable));
H->TableSize = findprime(k);//找到一个大于等于n的素数作为哈希表中数组的长度
H->Cells=(struct HashEntry *)malloc(sizeof(struct HashEntry) * H->TableSize);
for(i=0;i<H->TableSize;i++){
H->Cells[i].Info=Empty;//初始化
}
return H;
};
int Hash(int k,int TableSize ){
return k% TableSize;//求余取下标
}
int find(struct HashTable * H,int K){
int Pos,newPos;
int num=0;
Pos=Hash(K,H->TableSize);
newPos=Pos;
while(H->Cells[newPos].Info!=Empty&&H->Cells[newPos].Data!=K){
num++;
newPos=Pos+num;
if(newPos>=H->TableSize)
newPos%=H->TableSize;
}
return newPos;
}
void insert(struct HashTable *H,int k,int i){
int pos;
pos=find(H,k);
if(H->Cells[pos].Info!=Legitimate){
H->Cells[pos].Info=Legitimate;
H->Cells[pos].Data=k;
a[i]=k;//如果数有重复的,则a[i]中的值仍然为0
}
}
int findx(struct HashTable *H, int K) {
int Pos,newPos;
int num = 0;
Pos = Hash(K, H->TableSize);
newPos = Pos;
while (H->Cells[newPos].Info != Empty
&& H->Cells[newPos].Data != K ) {
num ++;
newPos = Pos + num;//线性探测解决冲突
if (newPos >= H->TableSize)
newPos %= H->TableSize;
}
if( H->Cells[newPos].Data == K){
printf("%d\n",newPos);
}
else{
printf("not found\n");
}
printf("\n");
return 0;
}
int findcishu(struct HashTable *H,int k)
{
int Pos,newPos;
int num = 0;
int n=1;
Pos = Hash(k, H->TableSize);//用取余数法得到数组的下标
newPos = Pos;
while (H->Cells[newPos].Info != Empty && H->Cells[newPos].Data != k )
{
num ++;
newPos = Pos + num;
n++;
if (newPos >= H->TableSize)
newPos %= H->TableSize;
}
if( H->Cells[newPos].Data == k)
return n;
else
return 0;
}
int main(){
struct HashTable *H;
int n;
scanf("%d",&n);//n在1000之内
H=CreateTable(n);
srand((int)time(NULL));
int i,j,k=0,w=0;
for(i=0;i<n;i++)
{
j=rand()%1001;//产生【0-1000】的随机数
printf("%d ",j);
if(j==0)//当产生的随机数就为0时,记录数组的下标
k=i;
w=1;
insert(H,j,i);
}
printf("\n");
printf("\n");
for(i=0;i<n;i++){//输出a[i]数组的值,判断是不是解决了重复元素的问题
printf("%d ",a[i]);
}
printf("\n");
printf("\n");
int c[3];//输出下标,验证这三个数哈希表中的数组位置是否正确
for(i=0;i<3;i++)
{
scanf("%d",&c[i]);
findx(H,c[i]);
}
float sum=0;
int o=0;
for(i=0;i<n;i++){
if(a[i]!=0||(i==k&&w==1)){//哈希表中不可以有重复的元素,为0则代表为重复,当i==k时,代表产生的随机数中就有0
sum+=findcishu(H,a[i]);//w=1用来预防a[0]=0但是a[0]是空的情况
o++;//o用来记录有多少个有效数字
}
}
float p;
p=sum/o;
printf("%.2f",p);//输出ASL的值
return 0;
}
在草稿纸上计算,验证ASL和下标的准确性,比8大的最小素数是11,则构建一个11的数组存放随机数