顺序查找:从表的一端开始,依次将记录在表中的关键字与给定值进行比较,若某个记录的关键字和给定值相同,则查找成功;反之查找失败。
顺序查找既适用于顺序表,又适用于线性表,首先先介绍顺序表中的顺序查找
数据结构类型定义如下:
typedef struct
{
KeyType key; //关键字域
InfoType otherinfo; //其他域
}ElemType;
定义单个结点后,再定义顺序表
typedef struct
{
ElemType *R; //(ElemType a[100])存储空间基地址
int length; //顺序表长度
}List;
接下来就是顺序查找的算法描述
bool Search(List B,KeyType key)
{//再顺序表中查找关键字与key相等的元素,若找到要输出该元素所包含的所有信息并返回正确
找不到则返回错误
for(int i=B.length;i>=1;i--)
{//从后往前进行比较查找,因为0的位置没有值,所以比较到1就停止
if(B.a[i]==key)
{
printf(该元素的所有信息);
return Ture;
break;
}
if(i==0)retur False;
}
}
源代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
//创建单个结点
typedef struct
{
char name[6];
int price;
}book;
//创建顺序表结构体
typedef struct
{
book elem[MAXSIZE];
int length;//顺序表的长度
}books;
//初始化顺序表
void Init(books B)
{
B.length=0;
}
bool CreatList(books &B,int n)
{
if(n<0||n>MAXSIZE) return false;//当n数量不对时返回错误
//从1开始赋值顺序表 ,让零闲置
for(int i=1;i<=n;i++)
{
scanf("%s %d",&B.elem[i].name,&B.elem[i].price);
B.length++;
}
return true;
}
//向顺序表中输入元素
void PutIn(books &B)
{
int n;
bool flag;//创建布尔类型变量
printf("输入数量\n");
scanf("%d",&n);
printf("输入数据\n");
flag=CreatList(B, n);
if(flag) printf("创建成功\n");
else printf("输入长度非法\n");
}
//顺序查找
void Search_Seq(books B)
{
char b[6];
printf("输入查询书籍\n");
scanf("%s",b);
//从后往前查找
for(int i=B.length;i>=1;i--){
if(strcmp(B.elem[i].name,b)==0){
printf("查询成功\n");
printf("%s %d",B.elem[i].name,B.elem[i].price);
break;
}
if(i==0) printf("所查书籍不在系统中\n");
}
}
//主函数
int main()
{
books B;
Init(B);
PutIn(B);
Search_Seq(B);
return 0;
}
在以上代码的顺序查找中,每步都要进行i>=1的比较,所用时间较长,改进这个程序将空闲的0的位置赋值关键字key,可以使程序运行时间减少很多,这时将a[0]称为监视哨
函数
bool Search(List B,ElemType key)
{
B.a[0].key=key;
for(int i=B.length;B.a[i].key!=key;i--)
return i;
}
具体使用方法将不再展示,与上一个方法大致相同