在这里我们采用最简单的查找算法,就是顺序查找。
主要工作:
1、新建一个数据结构SeqList代表顺序表。
2、确定线性表长度,元素内容,和查找元素,返回元素的位置。
1、当我们新建一个C++控制台应用程序之后,默认的给出的初始代码如下:
1 #include "stdafx.h" 2 3 int _tmain(int argc, _TCHAR* argv[]) 4 { 5 return 0; 6 }
那么这个#include "stdafx.h" 与#include "stdio.h" 是什么关系呢,我们看一下stdfx.h的定义内容:
#pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h>
这样就明白了,stdfx.h里面包含了stdio.h,这个问题就不用纠结了。
2、明确一下,我们顺序表中的元素数据类型都是int类型,所以要提前定义一下:
#define ElemType int
为了演示方便我们限定一下列表的最大长度为100,同样需要提前声明一下:
#define MAXSIZE 100
3、顺序表的数据结构
1 typedef struct 2 { 3 ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/ 4 int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),从0开始,空表置为-1*/ 5 }SeqList;
4、查找函数
1 int Locate(SeqList L, ElemType e) 2 { 3 int i=0; /*i为扫描计数器,初值为0,即从第一个元素开始比较*/ 4 while ((i<=L.last)&&(L.elem[i]!=e)) /*顺序扫描表,直到找到值为key的元素, 或扫描到表尾而没找到*/ 5 i++; 6 if (i<=L.last) 7 return(i+1); /*若找到值为e的元素,则返回其序号*/ 8 else 9 return(-1); /*若没找到,则返回空序号*/ 10 }
需要注意的是在这里我们如果查找到相关元素,返回的是它的位置,不是索引,所以是从1开始。
5、完整代码
1 // SqlList.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 6 #define ElemType int 7 #define MAXSIZE 100 8 9 typedef struct 10 { 11 ElemType elem[MAXSIZE]; 12 int last; 13 }SeqList; 14 15 int Locate(SeqList L, ElemType e) 16 { 17 int i=0; /*i为扫描计数器,初值为0,即从第一个元素开始比较*/ 18 while ((i<=L.last)&&(L.elem[i]!=e)) /*顺序扫描表,直到找到值为key的元素, 或扫描到表尾而没找到*/ 19 i++; 20 if (i<=L.last) 21 return(i+1); /*若找到值为e的元素,则返回其序号*/ 22 else 23 return(-1); /*若没找到,则返回空序号*/ 24 } 25 26 int _tmain(int argc, _TCHAR* argv[]) 27 { 28 SeqList l; 29 int p,q,r; 30 int i; 31 printf("请输入线性表的长度:"); 32 scanf("%d",&r); 33 l.last = r-1; 34 printf("请输入线性表的各元素值:\n"); 35 for(i=0; i<=l.last; i++) 36 { 37 scanf("%d",&l.elem[i]); 38 } 39 printf("请输入要查找的元素值:\n"); 40 scanf("%d",&q); 41 p=Locate(l,q); 42 if(p == -1) 43 printf("在此线性表中没有该元素!\n"); 44 else 45 printf("该元素在线性表中的位置为:%d\n",p); 46 return 0; 47 }