线性表的查找 C语言

还是书上的内容。
(1)折半查找
我这里先写折半查找(又名二分查找),是一种效率较高的查找方法,就是有个前提,查找数据的前提是数据本身是从小到大的有序排列的。只适用于有序表。时间复杂度为:在这里插入图片描述
代码如下:

int SearchList3(SSTable ST,int key)//折半查找(二分查找),前提必须是从小到大的有序排序 
{
	int mid,
		low = 1,
		high = ST.length;//初始化完成 
	while(low<high)
	{
		mid = (low+high)/2; 
		if(key == ST.Elem[mid].key)//找到待查找元素 
			return mid;
		else if(key<ST.Elem[mid].key)//继续在前一子表进行查找 
			high = mid-1;
		else//继续在后一子表进行查找 
			low = mid+1;
	}
	return 0;//表中不存在待查元素 
} 

(2)顺序查找
1.无脑查找(自己起的名字,不要介意)
没有什么特殊条件,只是无脑的从前往后找(或者从后往前找)直到所有数据都遍历结束。
2.设置监视哨的顺序查找
数据中的数值[0]元素起到监视哨的作用,也是从前往后查找(或者从后往前查找)直到出现要查找的值为止,若不出现则也是遍历了所有数据元素结束。时间复杂度为O(n)。
完整代码如下(该代码中没有折半查找,折半查找需要特定的输入有序排列):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100 //顺序表最大容量 

typedef struct 
{
	int key;//数据域 
	int otherinfo;//其他域 
}ElemType;
typedef struct//顺序表 
{
	ElemType *Elem;//存储空间基地址 
	int length;//当前长度 
}SSTable;

void InitList(SSTable &ST)//顺序表的初始化 
{
	ST.Elem = (ElemType*)malloc(sizeof(ElemType)*MAXSIZE);//为顺序表申请空间 
	ST.length = 0;//使顺序表长度初始化为0 
}

void MyList(SSTable &ST)//创建顺序表 
{
	printf("输入数据:"); 
	while(1)//创建一个死循环 
	{
		ST.length++;//表长自加1 
		scanf("%d",&ST.Elem[ST.length].key);//输入表数据,这里是从[1]开始输入 
		if(getchar()=='\n')//死循环结束条件 
			break;
	}
}

void OutputList(SSTable ST)//顺序表的输出 
{
	int i;
	printf("打印:");
	for(i=0;i<ST.length;i++)//利用循环遍历顺序表 
		printf("%d  ",ST.Elem[i+1].key);
	printf("\n");
}

int SearchList1(SSTable ST,int key)//顺序查找 
{//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0 
	int i;
	for(i=ST.length;i>=i;i--)//从后往前查找 
	{
		if(ST.Elem[i].key == key)
			return i;
	}
	return 0;
}

int SearchList2(SSTable ST,int key)//设置监视哨的顺序查找 
{//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0 
	int i;
	ST.Elem[0].key = key;//“哨兵” 
	for(i=ST.length;ST.Elem[i].key!=key;i--);//从后往前找 
	return i;
} 

int main()
{
	SSTable ST; 
	InitList(ST);//初始化顺序表 
	MyList(ST);//创建顺序表 
	OutputList(ST);//顺序表的输出 
	printf("%d  ",SearchList1(ST,15));//顺序查找函数 ,函数中的数据是为了方便测试代码,可更换成变量 
	printf("%d  ",SearchList2(ST,16));
	free(ST.Elem);
	return 0;
} 

结果演示:
在这里插入图片描述
(完)

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值