元素的查找-顺序查找

元素查找

  • 静态查找:元素是记录固定的,只有查找,无其它操作。
  • 动态查找:数据记录的是动态变化的,除了查找,还可以删除,增加操作。

静态查找:
方法一 :对于未排序的数据——顺序查找
方法二:排好次序的数据———二分法查找

顺序查找中分为有”哨兵”的方法和无”哨兵”的方法。


方法一 顺序查找

有“哨兵”的顺序查找如下:
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. 思路:
    (1)初始化创建存储数据的结构体List;
    (2)给静态数组赋初值tb.elem[i];
    (3)遍历判断条件:序号i大于0且当前元素不为所找元素k;
    (4)指针首先指向末尾元素,依次由末尾向开始遍历;
    (4)遍历存储的数组并判断是否存在要查找的k值;
    (5)若存在则返回该k值所在的序号i,若不存在则返回序号值为0;
    //注:不需要把第一个元素赋值为所寻的k值;

  2. 代码:

    将上面有”哨兵”遍历的方法中的 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值