元素查找
- 静态查找:元素是记录固定的,只有查找,无其它操作。
- 动态查找:数据记录的是动态变化的,除了查找,还可以删除,增加操作。
静态查找:
方法一 :对于未排序的数据——顺序查找
方法二:排好次序的数据———二分法查找
顺序查找中分为有”哨兵”的方法和无”哨兵”的方法。
方法一 顺序查找
有“哨兵”的顺序查找如下:
1. 思路:
(1)初始化创建存储数据的结构体List;
(2)给静态数组赋初值tb.elem[i];
(3)创建一个“哨兵” 即tb.elem[0],并将其赋予值为所要查找的k值;
(4)指针首先指向末尾元素,依次由末尾向开始遍历;
(5)遍历存储的数组并判断是否存在要查找的k值;
(6)若存在则返回该k值所在的序号i,若不存在则返回序号值为0;
静态存储数据,如图所示:
2 . 代码:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define KeyType int
#define MaxSize 30
/*创建结构体*/
typedef struct{
ElemType *elem;
int length;
}List;
/*赋予结构体数组为:02867,长度为:5*/
void creat(List &tb){
tb.elem=(ElemType*)malloc(MaxSize*sizeof(List));
tb.elem[0]=0;
tb.elem[1]=2;
tb.elem[2]=8;
tb.elem[3]=6;
tb.elem[4]=7;
tb.length=5;
}
/*判断两个数是否相等*/
bool Eq(int i,int key){
if(i==key){ return 1;}
else return 0;
}
/*有哨兵的方法,遍历判断*/
int SequentialSearch(List tb,KeyType k){
int i;
/*存放'哨兵'*/
tb.elem[0]=k;
/*若当前值与k不相等则依次继续遍历,索引值逐减1 */
for(i=tb.length;!Eq(tb.elem[i],k);--i);
/*相等或者遍历结束后返回当前序号值i */
return i;
}
/*主函数*/
void main(){
int i,j;
List tb;
creat(tb);
printf("请输入您要查询的数字:");
scanf("%d",&i);
j=SequentialSearch(tb,i);
if(j==0){
printf("没找到呀!");
printf("%d\n",j);
}else{
printf("找到了,序号为:");
printf("%d\n",j);
}
return ;
}
3 .运行截图:
寻找 66这个值,没找到:
寻找 8 这个值,找到了,并返回序号:
无“哨兵”的顺序查找:
思路:
(1)初始化创建存储数据的结构体List;
(2)给静态数组赋初值tb.elem[i];
(3)遍历判断条件:序号i大于0且当前元素不为所找元素k;
(4)指针首先指向末尾元素,依次由末尾向开始遍历;
(4)遍历存储的数组并判断是否存在要查找的k值;
(5)若存在则返回该k值所在的序号i,若不存在则返回序号值为0;
//注:不需要把第一个元素赋值为所寻的k值;代码:
将上面有”哨兵”遍历的方法中的 SequentialSearch(List tb,KeyType k)改为:
/*无哨兵的方法,遍历判断*/
int SequentialSearch(List tb,KeyType k){
int i;
/*若序号i大于0且当前值与k不相等则依次继续遍历,索引值逐减1 */
for(i=tb.length;i>0&&!Eq(tb.elem[i],k);--i);
/*相等或者遍历结束后返回当前序号值i */
return i;
}
3.运行截图:如有”哨兵”方法一样;
参考博客原址:https://blog.youkuaiyun.com/q270274978/article/details/8481565