我只是想对应该适用于任何表大小的哈希表实现二次探测。我在下面编写的代码仅在哈希表大小为 10 时才有效。
基本上,我必须对 while 循环进行限制,最多可以进行探测。我手动检查,发现对于 10 的表大小,每 6 个索引位置都在重复。所以我把 6 的限制放到了 while 循环中。
当涉及到任何其他表大小时,重复索引位置的数量会有所不同。所以,我无法决定何时停止迭代。我愿意接受任何其他方法来解决这个问题。
#include <stdio.h>
#include<stdlib.h>
#define TS 10
int ht[TS]={};
void insert()
{
int key,i=0,ind,s=0,hk;
// printf("\nenter a value to insert into htasht table\n");
scanf("%d",&key);
hk=key%TS;
while(s!=6)// limit=6 which is working only for table size 10
{
ind=(hk+i)%TS;
if(ht[ind] == 0 )
{
ht[ind]=key;
break;
}
s=s++;
i=(s*s)%TS;
}
if(s==6)
{
printf("value cant be inserted\n");
}
}
int search(int key)
{
int ind,i=0,hk,s=0;
hk=key%TS;
while(s!=6)
{
ind=(hk+i)%TS;
if(ht[ind]==key)
{
printf("value is found at ind %d\n ",ind);
return ind;
// break;
}s=s++;
i=(s*s)%TS;
}
if(s==6)
{
printf("value not found\n");
return 0;
}
// return 0;
}
void display()
{
int i;
printf("\nelements in thte htasht table are \n");
for(i=0;i< TS; i++)
printf("\n ind %d -- value = %d",i,ht[i]);
}
void del(int key)
{
int i,ind;
ind=search(key);
if(ind)
{
ht[ind]=0;
printf("deleted");
}
ind=0;
}
void main()
{
int opt,key,n;
/*printf("Enter step size of hash table\n");
scanf("%d",&s);
*/
while(1)
{
printf("\nPress 1. Insert\t 2. Display \t3. Search \t4.Delete\t 5.exit \n");
scanf("%d",&opt);
switch(opt)
{
case 1:printf("Enter how many values you want to enter\n");
scanf("%d",&n);
printf("enter values\n");
for(int j=0;j<n;j++)
{insert();}
// insert();
break;
case 2:
display();
break;
case 3:
printf("Enter search element\n");
scanf("%d",&key); search(key);
break;
case 4:
printf("Enter element to be deleted\n");
scanf("%d",&key);//search(key);
del(key);
break;
case 5:exit(0);
}
}
}