基本思想:
用所给关键字与线性表中各个数据进行逐一比较,直到成功或失败。
方法1:对查找数组中的某元素(逐一比较)
#include<stdio.h> #include<time.h> #include<stdlib.h> #define max_len 20 #define N 6 int SearchFun(int a[],int n,int x) //在给定长度的数组中查找数据元素x { int i,f=-1; for(i=0;i<n;i++) { if(x==a[i]) { f=i; break; } } return f; } void main() { int i; int k; //定义变量为要查找的元素 int res; //定义变量为查找函数的返回值 int shuzu[N]; srand(time(NULL)); //随机种子 for(i=0;i<N;i++) { shuzu[i]=rand()%(1000-100)+100; } printf("数组序列为: "); for(i=0;i<N;i++) { printf("%d ",shuzu[i]); } printf(" "); printf("输入要查找的元素:"); scanf("%d",&k); res=SearchFun(shuzu,N,k); if(res<0) printf("该元素不存在! "); else printf("该元素在表中的位置为:第%d个! ",res+1); printf(" "); system("pause"); }
结果显示:
方法2(针对顺序表):
这里主要按照关键字进行查找
从表中的最后一个记录开始,逐个比较记录中的关键字与给定关键字。若查找成功,函数返回该元素所在表中的位置
#include<stdio.h> #include<stdlib.h> #define max_len 20 typedef struct { int key; char data; }Record; typedef struct { Record r[max_len+1]; //令r[0]存放待查数据元素 int length; }seqTable; int SeqSearch(seqTable st,int k) { int i; st.r[0].key=k; i=st.length; while(st.r[i].key!=k) i--; return i; } void main() { seqTable st; int i; int len;//定义变量为待查表的长度 int ch; //定义变量为记录关键字 int k; //定义变量为要查找的元素 int res;//定义变量为查找函数的返回值 printf("输入所查表的长度:"); scanf("%d",&len); st.length=len; printf("输入查找表的%d个记录的关键字值(用空格隔开): ",len); for(i=1;i<=len;i++) { scanf("%d",&ch); st.r[i].key=ch; } printf("输入要查找的元素:"); scanf("%d",&k); res=SeqSearch(st,k); if(res==0) printf("该元素不存在! "); else printf("该元素在表中的位置为:第%d个! ",res); printf(" "); system("pause"); }
结果显示:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define max_len 100 typedef struct { char key[10]; char name[20]; int age; }Record; typedef struct { Record r[max_len+1]; //令r[0]存放待查数据元素 int length; }seqTable; void STInit(seqTable *st) //初始化顺序表 { st->length=0; } int STLength(seqTable st) //返回顺序表的元素个数 { return(st.length); } int STAdd(seqTable *st,Record data) //添加元素到顺序表的尾部 { if(st->length>=max_len) { printf("顺序表已满,不能再添加结点了! "); return 0; } st->r[++st->length]=data; return 1; } Record *STFindByNum(seqTable *st,int n) //根据序号查询节点,返回数据元素 { if((n<1)||(n>st->length+1)) { printf("节点序号错误,不能返回节点! "); return NULL; } return &(st->r[n]); } int STFindByKey(seqTable *st,char *k) //按照关键字查询节点 { int i; for(i=1;i<=st->length;i++) { if(strcmp(st->r[i].key,k)==0) { return i; } } return 0; } int STPrint(seqTable st) //显示顺序表中的所有节点 { int i; for(i=1;i<=st.length;i++) { printf("(%s,%s,%d) ",st.r[i].key,st.r[i].name,st.r[i].age); } return 0; } void main() { int i; seqTable st; //定义变量顺序表 Record data; //定义变量为保存数据类型 Record *pdata;//定义节点保存指针变量 char kk[10]; //定义变量为查询关键字 int res; printf("顺序表操作演示开始! "); STInit(&st);//初始化顺序表 printf("顺序表初始化完成! "); do { printf("输入添加的节点数据(学号 姓名 年龄):"); fflush(stdin); //清空输入缓冲区 scanf("%s%s%d",&data.key,&data.name,&data.age); if(data.age!=0) //若年龄不为0 { if(!STAdd(&st,data)) //若节点添加失败 { break; //退出死循环 } } else { break; //退出死循环 } } while(1); printf(" 顺序表中的节点顺序为: "); STPrint(st); //显示顺序表节点数据 fflush(stdin); //清空输入缓冲区 /* 按节点序号查询 */ printf(" 要查询的节点序号:"); scanf("%d",&i); pdata=STFindByNum(&st,i); if(pdata) { printf(" 第%d个节点为:(%s,%s,%d) ",i,pdata->key,pdata->name,pdata->age); } fflush(stdin); //清空输入缓冲区 /* 按关键字查询 */ printf(" 输入要查询的关键字:"); scanf("%s",&kk); res=STFindByKey(&st,kk); if(res==0) printf(" 该记录不存在! "); else printf(" 该记录在顺序表中的位置为:第%d个 ",res); printf(" "); system("pause"); }
结果显示: