查找:线性表的C语言代码实现(顺序查找、折半查找)
作者:互联网
目录
三、顺序查找 Search1函数(没有设置哨兵,需要比较两次)
四、顺序查找(设置哨兵,不用再比较是否会越界,只用比较一次)Search2函数
八、为了能在程序中一次实现以上函数,我们建立了一个Menu函数,根据用户选择,进行不同操作
一、线性表结构 两个类的定义
typedef struct//定义线性表数据项结构
{
int key;//关键字域
int otherinfo;
}ElemType;
typedef struct//定义一个线性表结构
{
int length;//顺序表的长度
ElemType* R;//顺序表的动态建立,R用于之后动态建立一块连续的存储空间,是建立的存储空间的基地址
}SeqList;
二、线性表的初始化以及根据输入的元素建立线性表
1.线性表的初始化,初始化一个空的线性表
为了使用bool函数,需要在头文件中加 #include<stdbool.h>
代码如下(示例):
//初始化线性表
bool InitList(SeqList& T)//&符号,是双向传递,引用
{
T.R = (ElemType*)malloc(sizeof(ElemType) * MaxSize);//分配一块MaxSize这么大的,该类型的空间,返回基地址R
if (!T.R)//检查是否成功给 线性表T分配空间
{
printf("分配空间失败");
return false;
}
T.length = 0;//令L.length=0
return true;
}
2.根据用户需求,向线性表中添加元素
我们刚开始输入数据,对线性表中的空间进行赋值,是从1号位开始的,0号位我们用来存放哨兵
//根据输入的元素建立线性表
bool CreateList(SeqList& T)
{
int n;
printf("请输入您想建立的线性表中元素的个数:\n");
scanf_s("%d", &n);
printf("请依次输入元素:\n");
for (int i = 1; i <= n; i++)
{
scanf_s("%d", &T.R[i].key);//赋值
L.length++//!!!!!!!!这个一定要记住,第一次就是因为这个忘记,后面的功能都实现错误
}
return true;
}
三、顺序查找 Search1函数(没有设置哨兵,需要比较两次)
//顺序查找 (没有设立哨兵)
int Search1(SeqList T, int key)
{
for (int i=1; i<=n; i++)
{
if (T.R[i].key == key)
return i;
}
return 0;
}
四、顺序查找(设置哨兵,不用再比较是否会越界,只用比较一次)Search2函数
int Search2(SeqList T, int key) //顺序查找 (设置哨兵)
{
//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
//该元素在表中的位置,否则为0
int i;
T.R[0].key = key; //“哨兵”
for (i =T.length; T.R[i].key != key; i--); //从后往前找,因为我们设置的哨兵在第一个位置
//所以要从后往前找
return i;
}
五、折半查找(非递归)Search3函数
//折半查找(非递归)
int Search3(SeqList T, int key)
{
int low = 1;
int high = T.length;
while (low <= high)
{
int mid = (low + high) / 2;
if (T.R[mid].key == key)
return mid;
else if (T.R[mid].key < key)
low = mid + 1;
else
high = mid - 1;
}
}
六、折半查找(递归)Search4函数
//折半查找(递归)
int Search4(SeqList T, int key, int low, int high)
{
//low = 1;
//high = T.length;
int mid = (low + high) / 2;
if (T.R[mid].key == key)
return mid;
else if (T.R[mid].key < key)
Search4(T, key, mid + 1, high);
else
Search4(T, key, low, mid-1);
}
七、显示输出函数 Show函数
void Show(int result, int key)
{
if (result == 0)
printf("没有找到该元素");
else
printf("找到元素%d,在第%d位", key, result);
}
/*这个result就是之前我们实现的4个查找函数中返回值i,因为我们刚开始输入数据,对线性表中的空间进行赋值,是从1号位开始的,0号位我们用来存放哨兵。所以最后返回的i就是元素所在的位置
如果i=0,这说明没有找到该元素,result=0*/
八、为了能在程序中一次实现以上函数,我们建立了一个Menu函数,根据用户选择,进行不同操作
真的很像我的大作业(傻掉)
void Menu() {
printf("\n************菜单***********\n");
printf("\n1.创建线性表;\n");
printf("\n2.顺序查找(无哨兵);\n");
printf("\n3.顺序查找(哨兵);\n");
printf("\n4.折半查找(非递归);\n");
printf("\n5.折半查找(递归);\n");
printf("\n0.退出;\n");
printf("\n***************************\n");
printf("\n【请输入你的选择】\n>>>");
printf("\n");
printf("\n");
printf("\n");
}
九、完整代码
因为我是在visual中运行,所以输入是scanf_s,如果uu们在自己的编译软件中运行,出现错误的话,把scanf_s ------>scanf即可
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>//如果想要使用bool型,则调用该头文件
#define MaxSize 10
typedef struct//定义线性表数据项结构
{
int key;//关键字域
int otherinfo;
}ElemType;
typedef struct//定义一个线性表结构
{
int length;//顺序表的长度
ElemType* R;//顺序表的动态建立,R用于之后动态建立一块连续的存储空间,是建立的存储空间的基地址
}SeqList;
//初始化线性表
bool InitList(SeqList& T)//&符号,是双向传递,引用
{
T.R = (ElemType*)malloc(sizeof(ElemType) * MaxSize);//分配一块MaxSize这么大的,该类型的空间,返回基地址R
if (!T.R)//检查是否成功给 线性表T分配空间
{
printf("分配空间失败");
return false;
}
T.length = 0;//令L.length=0
return true;
}
//根据输入的元素建立线性表
bool CreateList(SeqList& T)
{
int n;
printf("请输入您想建立的线性表中元素的个数:\n");
scanf_s("%d", &n);
printf("请依次输入元素:\n");
for (int i = 1; i <= n; i++)
{
scanf_s("%d", &T.R[i].key);//赋值
L.length++//!!!!!!!!这个一定要记住,第一次就是因为这个忘记,后面的功能都实现错误
}
return true;
}
//顺序查找 (没有设立哨兵)
int Search1(SeqList T, int key)
{
for (int i=1; i<=n; i++)
{
if (T.R[i].key == key)
return i;
}
return 0;
}
/*//顺序查找 (设立哨兵)
int Search2(SeqList T, int key)
{
T.R[0].key = key;
int i;
for (i = T.length; T.R[i].key != key;i--);
return i;
}*/
int Search2(SeqList T, int key) //顺序查找 (设立哨兵)
{
//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
//该元素在表中的位置,否则为0
int i;
T.R[0].key = key; //“哨兵”
for (i =T.length; T.R[i].key != key; i--); //从后往前找
return i;
}// Search_Seq
//折半查找(非递归)
int Search3(SeqList T, int key)
{
int low = 1;
int high = T.length;
while (low <= high)
{
int mid = (low + high) / 2;
if (T.R[mid].key == key)
return mid;
else if (T.R[mid].key < key)
low = mid + 1;
else
high = mid - 1;
}
}
//折半查找(递归)
int Search4(SeqList T, int key, int low, int high)
{
//low = 1;
//high = T.length;
int mid = (low + high) / 2;
if (T.R[mid].key == key)
return mid;
else if (T.R[mid].key < key)
Search4(T, key, mid + 1, high);
else
Search4(T, key, low, mid-1);
}
void Show(int result, int key)
{
if (result == 0)
printf("没有找到该元素");
else
printf("找到元素%d,在第%d位", key, result);
}
void Menu() {
printf("\n************菜单***********\n");
printf("\n1.创建线性表;\n");
printf("\n2.顺序查找(无哨兵);\n");
printf("\n3.顺序查找(哨兵);\n");
printf("\n4.折半查找(非递归);\n");
printf("\n5.折半查找(递归);\n");
printf("\n0.退出;\n");
printf("\n***************************\n");
printf("\n【请输入你的选择】\n>>>");
printf("\n");
printf("\n");
printf("\n");
}
int main() {
SeqList T;
int key, result, user;
while (true)
{
Menu();
scanf_s("%d", &user);
switch (user) {
case 1: {
if (InitList(T) && CreateList(T))
printf("\n【创建成功……】\n");
break;
}
case 2:
{
printf("\n-----------顺序查找无哨兵-----------\n");
printf("\n【请输入要查找的关键字】\n>>>");
//getchar();
scanf_s("%d", &key);
result = Search1(T, key);
Show(result, key);
printf("\n-------------------------------\n");
break;
}
case 3:
{
printf("\n-----------顺序查找哨兵-----------\n");
printf("\n【请输入要查找的关键字】\n>>>");
//getchar();
scanf_s("%d", &key);
result = Search2(T, key);
Show(result, key);
printf("\n-------------------------------\n");
break;
}
case 4:
{
printf("\n-----------折半查找(非递归)-----------\n");
printf("\n【请输入要查找的关键字】\n>>>");
//getchar();
scanf_s("%d", &key);
result = Search3(T, key);
Show(result, key);
printf("\n---------------------------------------\n");
break;
}
case 5: {
printf("\n-----------折半查找(递归)-----------\n");
printf("\n【请输入要查找的关键字】\n>>>");
//getchar();
scanf_s("%d", &key);
result = Search4(T, key, 1, T.length);
Show(result, key);
printf("\n-------------------------------------\n");
break;
}
case 0:default;
}
}
return 0;
}
运行截图:
功能1创建:
功能2:顺序查找无哨兵
功能3:顺序查找有哨兵
功能4:折半查找非递归
功能4:折半查找非递归
标签:折半,线性表,int,查找,key,printf 来源: https://blog.csdn.net/weixin_52375817/article/details/122077286