欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线性表查找值

程序员文章站 2024-03-22 18:47:10
...

对于线性表进行查找
先建立线性表,然后查找,先进行顺序查找,其顺序查找可以分为俩种情况
其一是不设置监视哨,其表示为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;
}