【查找思想】
从表的一端开始逐个将记录的关键字和给定K
值进行比较,若某个记录的关键字和给定K
值相等,查找成功;否则,若扫描完整个表,仍然没有找到相应的记录,则查找失败。
【算法实现】
#include<stdio.h>
#include<stdlib.h>
#define EQ(a,b) ((a)==(b))
/* 数据元素类型定义 */
typedef int KeyType; //关键字类型
typedef struct
{
KeyType key; //关键字域
//float weight; //其他域(此处可设为权重)
}ElemType;
/* 静态查找表的顺序存储结构 */
typedef struct
{
ElemType *elem; //数据元素存储空间基址,0号单元弃用
int length; //表长度
}SSTable;
//创建查找表
void Create(SSTable *ST)
{
printf("请输入查找表的长度:");
scanf("%d", &ST->length);
ST->elem = (ElemType *)malloc(ST->length*sizeof(ElemType));
printf("请依次输入表中数据元素的关键字:");
for(int i = 1; i <= ST->length; i++)
scanf("%d", &ST->elem[i].key);
}
//顺序查找
int Seq_Search(SSTable ST, KeyType key)
{
int i;
ST.elem[0].key = key; //设置监视哨兵,失败返回0
for(i = ST.length; !EQ(ST.elem[i].key, key); --i);
return i;
}
int main()
{
SSTable ST;
KeyType key;
Create(&ST);
printf("请输入待查找数据元素的关键字:");
scanf("%d", &key);
printf("查找位置为:%d\n", Seq_Search(ST, key));
return 0;
}
运行结果如下:
【算法分析】
- 等概率查找成功时,查找第 个元素成功的比较次数 ,则平均查找长度ASL:
- 包含查找不成功时,查找失败的比较次数为 ,若成功与不成功的概率相等,对每个记录的查找概率为 ,则平均查找长度ASL: