线性表查找值

9 篇文章 0 订阅
7 篇文章 0 订阅
这篇博客探讨了线性表的查找方法,包括设置监视哨的顺序查找和不设置监视哨的顺序查找,指出前者效率更高。此外,还介绍了冒泡排序对线性表进行排序,并应用二分查找提高查找效率。通过示例代码展示了这些算法的实现过程。
摘要由CSDN通过智能技术生成

对于线性表进行查找
先建立线性表,然后查找,先进行顺序查找,其顺序查找可以分为俩种情况
其一是不设置监视哨,其表示为while(n>=1&&l.r[n].key!=k)
其二是设置监视哨,就是在数组的第0个位置,进行从后到前的查找,如果最后找到了返回值是0,那么就是没有找到,否则返回相应的位置,第二种的判定条件,while(l.r[z].key!=k)
注意:**其第二种的判定条件明显比一中要少,那么查找效率也会高很多,所以能用第二种就不用第一种,效率高
还有就是用二分查找必须排好序
排好序可以用冒泡排序,也可以用选择排序
我用了
冒泡排序**

#include<stdio.h>
#define   LIST_SIZE  20
typedef   struct{
	int   key;
}RecordType;
typedef   struct{
	RecordType   r[LIST_SIZE+1];
	int  length; 
}RecordList;
void    create(RecordList  *l){
	int   i;
	l->length=6;
	printf("请输入值(5个):\n");
	for(i=1;i<=l->length;i++){
		scanf("%d",&l->r[i].key);
	}
}
void   printf1(RecordList   l){
	int   j;
	for(j=1;j<=l.length;j++){
		printf("%d\n",l.r[j].key);
	}
}
//监视哨的顺序查找 
int  SeqSearch(RecordList l,int  k){
	int  z;
	l.r[0].key=k;
	z=l.length;
	while(l.r[z].key!=k){
		z--;
	}
	return(z);
} 
//不设置监视哨的顺序查找
int    SeqSearch1(RecordList  l,int  k){
	int n=l.length;
	while(n>=1&&l.r[n].key!=k){
		n--;
	}
	if(n>=1){
		return(n);
	}else{
		return(0);
	}
}
//冒泡排序 
void   sort(RecordList l,int   n){
	int   i;
	int   j;
	int   e;
	for(i=0;i<n-1;i++){
		for(j=0;j<n-i-1;j++){
			if(l.r[j].key>l.r[j+1].key){
				int  temp=l.r[j].key;
				l.r[j].key=l.r[j+1].key;
				l.r[j+1].key=temp;				
			}
		}
	}
	printf("经过冒泡排序好的顺序表:\n");
	for(e=1;e<=l.length;e++){
		printf("%d\n",l.r[e].key);
	}
} 
//二分查找法
int   binsrch(RecordList   l,int   k){
	
    int	low=1;
	int   high=l.length;
	while(low<=high){
		int mid=(low+high)/2;
		if(k==l.r[mid].key){
			return(mid);
		}else  if(k<l.r[mid].key){
			high=mid-1;
		} else{
			low=mid+1;
		}
	}
	return  0;
} 
int  main(){
	RecordList   l;
	create(&l);
	printf("打印输出顺序表:\n");
	printf1(l);
	int   k;
	printf("请输入要查找的值:"); 
	scanf("%d",&k);
	int   u;
	u=SeqSearch(l,k);
	printf("其位于顺序表中的第%d个\n",u);
	printf("接下来用不设置监视哨的方法进行查找\n");
	printf("请输入要查找的值:\n"); 
	int   v;
	scanf("%d",&v);
	int w=SeqSearch1(l,v);
	printf("其位于顺序表的第%d位\n",w);
	printf("接下来进行二分查找法\n");
	sort(l,6);
	printf("请输入要查找的值:\n");
	int  x;
	scanf("%d",&x);
	int  d=binsrch(l,x);
	printf("其位于顺序表的第%d位\n",d); 
	return  0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值