数据结构实验(C语言):折半查找、哈希查找

文章参考过网上的内容,如有侵权,请联系

#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;
	    }
    }
 }
 }

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值