算法1:采用顺序存储结构创建静态查找表,对查找表进行顺序查找和改进的顺序查找,并对其查找效率进行比较;
算法2:采用顺序存储结构创建静态查找表——有序表,对有序表进行二分查找;
#include <stdio.h>
#include <stdlib.h>
typedef int KeyType;
//typedef float KeyType
//typedef char *KeyType
//对数值型关键字的比较宏定义
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
//数据元素类型定义
typedef struct{
KeyType key;//关键字域
//... //其他域
}ElemType;
typedef struct{
ElemType *elem;//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
int length;//表的长度
}SSTable;
int Create(SSTable *ST)
{//创建静态表
int i,n;
printf("请输入你要创建的表的长度:\n");
scanf("%d",&n);
ST->elem =(ElemType *)malloc((n+1)*sizeof(ElemType));
if(!ST->elem )
return 0;
printf("请输入%d个数据(若采用二分法查找关键字,则顺序输入)。\n",n);
for(i=1;i<=n;i++)
{
scanf("%d",&ST->elem [i].key);
}
ST->length =n;
return 1;
}
int Search_Seq(SSTable ST,KeyType key)
{//在顺序表ST中顺序查找其关键字等于key的数据元素,
//若找到,咋返回它在表中的位置,否则返回0.
int i=1;
while(i<=ST.length &&!EQ(ST.elem [i].key,key))
++i;
if(i<=ST.length )
return i;
else
return 0;
}
int Search_SSeq(SSTable ST,KeyType key)
{//改进算法。在顺序表ST中顺序查找其关键字等于key的数
//据元素,若找到,则返回它在表中的位置,否则返回0.
int i;
ST.elem [0].key=key;//哨兵
for(i=ST.length ;!EQ(ST.elem [i].key,key);--i);//从后往前找
return i;//返回找到元素在表中的位置i,找不到时,i为0
}
int Search_Bin(SSTable ST,KeyType key)
{//在有序表ST中折半查找其关键字等于key的数据元素。
//若找到,则函数值为该元素在表中的位置,否则为0.
int low=1;
int high=ST.length ;//置区间初值
while(low<=high){
int 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;//继续在后半区间进行查找
}
}
int main()
{
int i,time;
SSTable ST;
KeyType key;
printf("请输入创建表的类型(0.无序表,1.有序表):\n");
scanf("%d",&time);
Create(&ST);
printf("创建成功!\n");
printf("请输入需查找的关键字:\n");
scanf("%d",&key);
if(time==0)
{
printf("顺序查找关键字结果为:\n");
i=Search_Seq(ST,key);
if(i==0)
{
printf("查找失败,表中无此元素\n");
}
else
{
printf("查找成功!\n");
printf("位置是%d\n",i);
}
printf("改进算法顺序查找关键字结果为:\n");
i=Search_SSeq(ST,key);
if(i==0)
{
printf("查找失败,表中无此元素\n");
}
else
{
printf("查找成功!\n");
printf("位置是%d\n",i);
}
}
else
{
printf("二分查找关键字结果为:\n");
i=Search_Bin(ST,key);
if(i==0)
{
printf("查找失败,表中无此元素\n");
}
else
{
printf("查找成功!\n");
printf("位置是%d\n",i);
}
}
}