用所给关键字与线性表中各元素的关键字逐个比较,直到成功或失败。存储长为顺序结构,也可为链式结构,本文采用顺序存储结构
通过设置监听哨防止查找越界
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//设有监听哨的顺序查找
#define OK 1
#define ERROR 0
typedef int KeyType;
typedef struct{
KeyType key;//顺序表元素值
}RecordType;
typedef struct{
RecordType *r;//数组r
int length;//顺序表长度
}RecordList;
int SeqSet(RecordList *L){
int i;
printf("请输入线性表长度:");
scanf("%d",&(L->length));
printf("请输入线性表中元素:");
L->r=(RecordType*)malloc((L->length+1)*sizeof(RecordType));//动态分配数组存储空间为L->length+1
for(i=1;i<=L->length;i++){
scanf("%d",&(L->r[i].key));//为地址为1到L->length数组元素赋值
}
return 0;
}
int SeqSearch(RecordList L,KeyType k,int i){
/** 从第L->length个元素从后往前查找
* L.r[0]为监听哨,在顺序表中查找关键字值等于k的元素,找到返回其位置,否则返回0
*/
L.r[0].key=k;
while(L.r[i].key!=k){
i--;
}
return(i);
}
int main() {
//value为需要查找的值,position为元素所在位置
RecordList a;
KeyType value;
int position,i;
SeqSet(&a);
i=a.length;
printf("请输入要查找的值:");
scanf("%d",&value);
printf("值为%d的元素的位置为:",value);
while(i>=0){//找出所有值为value的元素,并输出
position=SeqSearch(a,value,i);
if(position!=0)
printf("%d ",position);
i=position-1;
//赋予新的i值,从刚找到值为value的元素的前一个位置开始查找,新位置-1赋值给i
}
printf("\n");
return 0;
}