顺序查找的两种方法

顺序查找—暴力解法:

#include <windows.h>
#include <stdio.h>

//结构体:存储数据元素和元素信息
typedef struct 
{
    int *data;      //数据域
    int length;     //数据域可存储的最大数量
    int  nums;      //元素数量
}List;

//函数声明
List *Init_List(int lenegth);   //初始化
void Add_List(List *list,int val);  //添加数据
boolean Is_Empty(List *list);       //判断是否为空
boolean Is_FuLL(List *list);       //判断是否为满
void Show_List(List *list);         //显示数据
int Search_Target(List *list,int target);   //暴力顺序查找

void main()
{
    List *list;
    int length;
    int index;

    printf("请输入数据域长度:");
    scanf("%d",&length);
    list = Init_List(length);

    Add_List(list,4);
    Add_List(list,6);
    Add_List(list,5);
    Add_List(list,8);
    Show_List(list);

    index = Search_Target(list,8);

    if(index == -2)
    {
        printf("查找元素不存在\n");
    }
    else
    {
        printf("查找元素的下标为:\t%d\n",index);
    }
    
    system("pause");
    return ;
}

List *Init_List(int length)
{
    List *list = (List *)malloc(sizeof(List));
    list->data = (int *)malloc(sizeof(int) * length);   //数据域内存申请
    list->length = length;  //初始化最大容量
    list->nums = 0;         //初始化元素数量
    return list;
}

void Add_List(List *list,int val)
{   //若数据域存储已满则无法添加数据
    if(Is_FuLL(list))
        return ;

    list->data[list->nums++] = val;     //将数据放入数据域中同时 nums加 1
}

boolean Is_Empty(List *list)
{
    if(list->nums == 0)
        return TRUE;
    return FALSE;
}

boolean Is_FuLL(List *list)
{
    if(list->length == list->nums)
        return TRUE;
    return FALSE;
}
void Show_List(List *list)
{
    //数据为空直接退出
    if(Is_Empty(list))
        return ;
    printf("数据元素为:\n");
    for(int i = 0;i < list->nums;i++)
    {
        printf("%d\t",list->data[i]);
    }
    printf("\n");
}

int Search_Target(List *list,int target)
{
    //数据为空直接退出
    if(Is_Empty(list))
        return -1;

    for(int i = 0;i < list->nums;i++)
    {
        if(list->data[i] == target)
            return i;
    }

    return -2;
}

在这里插入图片描述

顺序查找—带哨兵解法:

思路:将数据域的第一个位置放置要查找的数据,从数据域尾向前遍历,当存在与目标值相等时返回当前位置下标,若返回下标为0,则说明数据域不存在目标数据。此方法的优点在于节省for循环中判断 i 值是否小于数据域长度,优化时间复杂度。

#include <windows.h>
#include <stdio.h>
//带哨兵的顺序查找
//结构体:存储数据元素和元素信息
typedef struct 
{
    int *data;      //数据域
    int length;     //数据域可存储的最大数量
    int  nums;      //元素数量
}List;

//函数声明
List *Init_List(int lenegth);   //初始化
void Add_List(List *list,int val);  //添加数据
boolean Is_Empty(List *list);       //判断是否为空
boolean Is_FuLL(List *list);       //判断是否为满
void Show_List(List *list);         //显示数据
int Search_Target(List *list,int target);   //暴力顺序查找

void main()
{
    List *list;
    int length;
    int index;

    printf("请输入数据域长度:");
    scanf("%d",&length);
    list = Init_List(length);

    Add_List(list,5);
    Add_List(list,6);
    Add_List(list,7);
    Add_List(list,8);

    index = Search_Target(list,66);
    Show_List(list);

    if(index == 0)
    {
        printf("查找元素不存在\n");
    }
    else
    {
        printf("查找元素的下标为:\t%d\n",index);
    }
    
    system("pause");
    return ;
}

List *Init_List(int length)
{
    List *list = (List *)malloc(sizeof(List));
    list->data = (int *)malloc(sizeof(int) * length);   //数据域内存申请
    list->length = length;  //初始化最大容量
    list->nums = 1;         //初始化元素数量 1
    return list;
}

void Add_List(List *list,int val)
{    
    if(Is_FuLL(list))
        return ;

    list->data[list->nums++] = val;     //将数据放入数据域中同时 nums加 1
}

boolean Is_Empty(List *list)
{
    if(list->nums == 1)
        return TRUE;
    return FALSE;
}

boolean Is_FuLL(List *list)
{
    if(list->length == list->nums)
        return TRUE;
    return FALSE;
}

void Show_List(List *list)
{
    //数据为空直接退出
    if(Is_Empty(list))
        return ;
    printf("数据元素为:\n");
    for(int i = 0;i < list->nums;i++)
    {
        printf("%d\t",list->data[i]);
    }
    printf("\n");
}

int Search_Target(List *list,int target)
{
    //数据为空直接退出
    if(Is_Empty(list))
        return -1;
    int i;
    list->data[0] = target;

    for(i = list->nums - 1;list->data[i] != target;i--){
    }
    return i;

}

在这里插入图片描述

出处:B站—TyrantLucifer
声明:此文章为学习笔记,如有侵权请联系删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Byte_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值