这篇文章将简单介绍三大查找中的顺序查找,顺序查找主要用于线性表中的查找,其中,线性表可有序可无序。
顺序查找的缺点是,当n较大时,平均查找长度较大,效率低;优点是对数据元素的存储没有要求,顺序存储或链式存储皆可。
对于无序表:
查找成功的平均查找长度为(n+1)/2
查找失败的平均查找长度为n+1
对于有序表:
查找成功的平均查找长度为(n+1)/2
查找失败的平均查找长度为n/2+n/(n+1)
下面将投放C代码
代码呢,分别展示了链表和顺序表的顺序查找方法
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
#define keyType int
//数据元素结构体
typedef struct {
keyType key; //查找表中每个数据元素的值
}ElemType;
//顺序表结构体
typedef struct{
int data[MaxSize];
int length;
}SeqList;
//查找表的数据结构
typedef struct{
ElemType *elem; //存放查找表中数据元素的数组
int length; //记录查找表中数据的总数量
}SSTable,*SSTableList;
//创建顺序表
void createTable(SeqList &L){
int i=0;
L.length=0; //用循环方法初始化时,千万要记得给length赋初值
for(;i<5;i++){
L.data[i] = i;
L.length++;
}
}
//输出顺序表
void printTable(SeqList L){
int i;
for(i = 0;i<L.length;i++){
printf("%d\t",L.data[i]);
}
printf("\n");
}
//创建查找表
void Create(SSTableList &T,int length){
T=(SSTable *)malloc(sizeof(SSTable));
T->length=length;
T->elem =(ElemType *)malloc((length+1)*sizeof(ElemType));
//根据查找表中数据元素的总长度,在存储时,从数组下标为 1 的空间开始存储数据
for (int i=1; i<=length; i++) {
T->elem[i].key = i;
}
}
//链表查找表查找的功能函数,其中key为关键字
int Search_Link(SSTableList T,keyType key){
T->elem[0].key = key; //0号做为哨兵
int i;
for(i = T->length; T->elem[i].key!=key; i--);
return i;
}
//顺序查找表查找的功能函数,其中key为关键字
int Search_Seq(SeqList T,keyType key){
int i;
for(i = T.length-1; T.data[i]!=key; i--);
return i;
}
int main(int argc, const char * argv[]) {
SSTableList T; //创建查找表
Create(T,6);
printf("请输入查找数据的关键字:\n");
int key;
scanf("%d",&key);
int location=Search_Link(T, key); //顺序查找key
if (location==0) {
printf("查找失败\n");
}else{
printf("数据在查找表中的位置为:%d\n",location);
}
SeqList L; //创建顺序表
createTable(L);
printTable(L); //输出顺序表
int location1=Search_Seq(L, key)+1; //顺序查找key
if (location1==-1) {
printf("查找失败\n");
}else{
printf("数据在查找表中的位置为:%d\n",location1);
}
return 0;
}