线性表查找值
程序员文章站
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;
}