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