文章参考过网上的内容,如有侵权,请联系
#include<stdio.h>
#include<stdlib.h>
#define HASHSIZE 12
#define NULLKEY -32768
typedef struct
{
int *elem; //数据元素储存空间基址,建表示按实际长度分配,0号单元留空
int length; //表长度
}SSTable,HashTable;
/*typedef struct
{
int *elem; //数据元素存储基址,动态分配数组
int count1; //当前数据元素个数
}HashTable;*/
int m=HASHSIZE;
int Search_Seq(SSTable ST,int key)
{ //在顺序表ST中顺序查找其关键字等于key的数据元素。若找到
//则函数值该元素在表中的位置,否则为0
ST.elem[0]=key; //哨兵
int i;
for(i=ST.length;ST.elem[i]!=key;--i) ;//从后往前找
return i;//找不到时,i为0
}
int Search_Bin(SSTable ST,int key)
{ //在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为
//该元素在表中的位置,否则为0
int low=1; int high=ST.length; //置区间初值
while(low<=high){
int mid=(low+high)/2;
if(ST.elem[mid]==key) return mid; //找到待查找元素
else if(ST.elem[mid]>key) high=mid-1; //继续在前半区间进行查找
else low=mid+1; //继续在后半区间进行查找
}
return 0; //顺序表中不存在待查找元素
}
//初始化散列表
int InitHashTable(HashTable *H)
{
int i;
H->length=m;
H->elem=(int*)malloc(m*sizeof(int));
for(i=0;i<m;i++)
H->elem[i]=NULLKEY;
return 1;
}
void InitSSTable(SSTable &ST)
{
ST.length=m;
ST.elem=(int *)malloc((m+1)*sizeof(int));
}
//散列函数
int Hash(int key)
{
return key%m;
}
//插入关键字进入散列表
void InsertHash(HashTable *H,int key)
{
int addr=Hash(key);
while(H->elem[addr]!=NULLKEY)
addr=(addr+1)%m;
H->elem[addr]=key;
}
//散列表查找关键字
int SearchHash(HashTable H,int key,int *addr)
{
*addr=Hash(key);
while(H.elem[*addr]!=key)
{
*addr=(*addr+1)%m;
if(H.elem[*addr]==NULLKEY||*addr==Hash(key))
{
return -1;
}
}
return *addr;
}
int main()
{
SSTable St;
InitSSTable(St);
int a[12]={12,16,22,25,34,42,48,57,68,71,72,85};
HashTable H;
int i;
InitHashTable(&H);
printf("被查找数组\n");
for(i=0;i<m;i++){
InsertHash(&H,a[i]);
St.elem[i+1]=a[i];
printf("%d ",a[i]);
}
St.length=m;
printf("\n");
printf("---菜单---\n");
printf("1:顺序查找;2:折半查找;3:哈希查找\n");
int n;
while(1)
{printf("选择查找方式\n");
scanf("%d",&n);
switch(n)
{
case 3:
{
printf("插入之后的哈希表为:\n");
for(i=0;i<m;i++)
printf("%d,",H.elem[i]);
int addr,j;
j=SearchHash(H,a[5],&addr);
printf("搜索到a[5]的地址是:%d\n",j);
break;
}
case 1:
{
printf("查找22\n");
printf("元素位置:%d\n",Search_Seq(St,22));
break;
}
case 2:
{
printf("查找16\n");
printf("元素位置:%d\n",Search_Bin(St,16));
break;
}
}
}
}