I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

/*******************************************************************************
/* <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));
}

 

posted on 2008-10-23 15:48  jcsu  阅读(2782)  评论(0编辑  收藏  举报