顺序查找—暴力解法:
#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
声明:此文章为学习笔记,如有侵权请联系删除。