静态查找表算法

算法1:采用顺序存储结构创建静态查找表,对查找表进行顺序查找和改进的顺序查找,并对其查找效率进行比较;
算法2:采用顺序存储结构创建静态查找表——有序表,对有序表进行二分查找;

#include <stdio.h>
#include <stdlib.h>

typedef int KeyType;
//typedef float KeyType
//typedef char *KeyType

//对数值型关键字的比较宏定义
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))

//数据元素类型定义 
typedef struct{
 KeyType key;//关键字域
 //...       //其他域 
}ElemType;
typedef struct{
 ElemType *elem;//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
 int length;//表的长度 
}SSTable;

int Create(SSTable *ST)
{//创建静态表
 int i,n;
 printf("请输入你要创建的表的长度:\n");
 scanf("%d",&n);
 ST->elem =(ElemType *)malloc((n+1)*sizeof(ElemType));
 if(!ST->elem )
 return 0;
 printf("请输入%d个数据(若采用二分法查找关键字,则顺序输入)。\n",n);
 for(i=1;i<=n;i++)
 {
  scanf("%d",&ST->elem [i].key);
 }
 ST->length =n;
 return 1;
 } 

int Search_Seq(SSTable ST,KeyType key)
{//在顺序表ST中顺序查找其关键字等于key的数据元素,
 //若找到,咋返回它在表中的位置,否则返回0.
 int i=1;
 while(i<=ST.length &&!EQ(ST.elem [i].key,key))
 ++i;
 if(i<=ST.length )
 return i;
 else
 return 0; 
}

int Search_SSeq(SSTable ST,KeyType key)
{//改进算法。在顺序表ST中顺序查找其关键字等于key的数
 //据元素,若找到,则返回它在表中的位置,否则返回0.
 int i;
 ST.elem [0].key=key;//哨兵
 for(i=ST.length ;!EQ(ST.elem [i].key,key);--i);//从后往前找
 return i;//返回找到元素在表中的位置i,找不到时,i为0 
}

int Search_Bin(SSTable ST,KeyType key)
{//在有序表ST中折半查找其关键字等于key的数据元素。
//若找到,则函数值为该元素在表中的位置,否则为0.
 int low=1;
 int high=ST.length ;//置区间初值
 while(low<=high){
  int mid=(low+high)/2;
  if(EQ(key,ST.elem [mid].key))
  return mid;//找到待查元素
  else if(LT(key,ST.elem [mid].key))
  high=mid-1;//继续在前半区间进行查找
  else low=mid+1;//继续在后半区间进行查找 
 } 
 } 

 int main()
 {
  int i,time;
  SSTable ST;
  KeyType key;
  printf("请输入创建表的类型(0.无序表,1.有序表):\n");
  scanf("%d",&time);
  Create(&ST); 
  printf("创建成功!\n");
  printf("请输入需查找的关键字:\n");
  scanf("%d",&key);
  if(time==0)
  {
   printf("顺序查找关键字结果为:\n");
   i=Search_Seq(ST,key);
   if(i==0)
   {
    printf("查找失败,表中无此元素\n");
   }
   else
   {
    printf("查找成功!\n");
    printf("位置是%d\n",i);
   }
   printf("改进算法顺序查找关键字结果为:\n");
   i=Search_SSeq(ST,key);
   if(i==0)
   {
    printf("查找失败,表中无此元素\n");
   }
   else
   {
    printf("查找成功!\n");
    printf("位置是%d\n",i);
   }
  }
  else
  {
  printf("二分查找关键字结果为:\n");
   i=Search_Bin(ST,key);
   if(i==0)
   {
    printf("查找失败,表中无此元素\n");
   }
   else
   {
    printf("查找成功!\n");
    printf("位置是%d\n",i);
   } 
  }
 }
  • 18
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值