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