0
点赞
收藏
分享

微信扫一扫

我自己的代码

安七月读书 2022-02-09 阅读 52
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//平方探测法 
#define MAXTABLESIZE 10000

//返回比N大比MAXTABLESIZE小的最小素数
int NextPrime(int N)
{
	int i,p;
    if(N==1)
        return 2;

	p=(N%2)? N+2:N+1;//从第一个奇数开始
	while(p<=MAXTABLESIZE)
	{
		for(i=(int)sqrt(p);i>2;i--)
		{
			if(!p%i)
			    break;//不为素数,跳出循环 
		}
		if(i==2)
		    break;//走完循环,则p为素数
		else
		    p+=2; 
	} 
	return p;
} 

int Hash(int Key,int TableSize)
{
	return Key%TableSize;
}

int Find(int HashTable[],int Key,int Size)
{
    int NewPos,CurrentPos;
    NewPos=CurrentPos=Hash(Key,Size);
    int CNum=0;//记录冲突次数
    if(HashTable[NewPos]==-1)//位置空的,可以插入
    {
        HashTable[NewPos]=1;
        return NewPos;
    }
    while(CNum<=Size&&HashTable[NewPos]!=-1)//还没遍历整个表或者位置已经被占
    {
        CNum++;
        NewPos=(CurrentPos+CNum*CNum)%Size;
    }
    if(CNum>Size)
        return -1;
    else
    {
        HashTable[NewPos]=1;
        return NewPos;
    }
}

int main()
{
	int i,M,N;
	scanf("%d %d",&M,&N);//用户定的tablesize和插入的数字个数 
	int Size=NextPrime(M);//确定哈希表大小
    int *HashTable=(int *)malloc(Size*sizeof(int));
    
    //哈希表初始化,什么都没装
    for(i=0;i<Size;i++)
        HashTable[i]=-1;
    
    int Key,Pos;
	for(i=0;i<N;i++)
	{
		scanf("%d",&Key);
        Pos=Find(HashTable,Key,Size);
        if(Pos>=0)
            printf("%d",Pos);
        else
            printf("-");
        if(i!=N-1)
            printf(" ");
	} 
	return 0;
}
举报

相关推荐

0 条评论