《数据结构》顺序查找和折半查找

 

/* ******************************************************************************
/* <PRE>
/* 版权所有    : -
/* 模块名      : 查找
/* 文件名      : search.cpp
/* 功能描述    : 静态查找表中查找
/* 作者        : <xxx>
/* 版本        : 1.0
/* -----------------------------------------------------------------------------
/* 备注        : -
/* -----------------------------------------------------------------------------
/* 修改记录    :
/* 日 期        版本     修改人        修改内容
/* 2011/01/01   1.0      <xxx>         创建
/* </PRE>
******************************************************************************
*/
#include 
< stdio.h >
#include 
< stdlib.h >

/* *****************************************************************************
/* 数据类型和常量定义
/*****************************************************************************
*/
#define  OK       1
#define  ERROR    0
#define  OVERFLOW -2

typedef 
int    Status;   /*  函数结果状态码  */
typedef 
int    KeyType;  /*  整型关键字  */

/*  数值型关键字的比较  */
#define  EQ(a, b) ((a) == (b))
#define  LT(a, b) ((a) < (b))


/* *****************************************************************************
/* 数据结构定义
/*****************************************************************************
*/
/*  数据元素类型定义  */
typedef 
struct  {
    KeyType key;   
// 关键字域
}SElemType;

/*  静态查找表的顺序存储结构  */
typedef 
struct  {
    SElemType 
* elem;  /*  数据元素存储空间基址,建表时按实际长度分配,0号单元留空  */   
    
int  length;  /*  表长度  */  
} SSTable;


/* *****************************************************************************
/* 函数原型声明
/*****************************************************************************
*/
Status Create(SSTable 
& ST,  int  n);           // 构造静态查找表
int  Search_Seq(SSTable ST, KeyType key);   // 顺序查找顺序表
int  Search_Bin(SSTable ST, KeyType key);   // 折半查找有序表


/* ******************************************************************************
/* <FUNC>
/* 函数名   : Search_Seq
/* 功能     : 顺序查找
/* 参数     : -
/* 返回值   : -
/* 备注     : 在顺序表ST中顺序查找关键字等于key的数据元素。
/*            若找到, 则函数值为该元素在表中的位置, 否则为0
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
int  Search_Seq(SSTable ST, KeyType key)
{
    ST.elem[
0 ].key  =  key;                                    // 哨兵
     for  ( int  i  =  ST.length;  ! EQ(ST.elem[i].key, key);  -- i);  // 从后往前找
     return  i;                                                // 找不到时, i为0
}

/* ******************************************************************************
/* <FUNC>
/* 函数名   : Search_Bin
/* 功能     : 有序表的折半查找
/* 参数     : -
/* 返回值   : -
/* 备注     : 在有序表ST中折半查找关键字等于key的数据元素。
/*            若找到, 则函数值为该元素在表中的位置, 否则为0
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
int  Search_Bin(SSTable ST, KeyType key)
{
    
int  low  =   1 ;   int  high  =  ST.length;   int  mid;
    
while  (low  <=  high) {
        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 ;
    }
    
return   0 ;
}

/* ******************************************************************************
/* <FUNC>
/* 函数名   : Create
/* 功能     : 构造静态查找表
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status Create(SSTable 
& ST,  int  n)
{
    ST.elem 
=  (SElemType  * )malloc((n  +   1 *   sizeof (SElemType));
    
if  ( ! ST.elem) exit(OVERFLOW);
    printf(
" please input %d integers: \n " , n);
    
for  ( int  i  =   1 ; i  <=  n; i ++ )
    {
        scanf(
" %d " & ST.elem[i].key);
    }
    ST.length 
=  n;
    
return  OK;
}


/* ******************************************************************************
/* <FUNC>
/* 函数名   : main
/* 功能     : 测试函数
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
void  main()
{
    SSTable ST, STB;
    Create(ST, 
5 );
    printf(
" sequence search! index for %d is: %d\n " 1 , Search_Seq(ST,  1 ));
    Create(STB, 
5 );
    printf(
" binary search! index for %d is: %d\n " 6 , Search_Bin(STB,  6 ));
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值