- 主要内容:
(1)输入一批整型数据,建立顺序表,然后用顺序查找,查找一给定的整数;
(2)输入一批有序整型数据(如从小到大),然后用折半查找,查找一给定的整数。
- 代码模拟实现:
#include<iostream>
#include<bits/stdc++.h> //万能头文件
using namespace std;
#define maxsize 100
typedef struct
{
int *elem;
int length;
}sqlist;
void Initlist(sqlist &L)
{
L.elem=new int[maxsize];
L.length=0;
}
void Listinsert(sqlist &L,int e)
{
L.elem[L.length]=e;
L.length++;
}
int SearchElem(sqlist &L,int e)//带哨兵的顺序查找 返回下标
{ int i;
L.elem[L.length]=e;//在队尾设置一个哨兵
for(i=0;L.elem[i]!=e;i++);//从前往后找
return i;
}
void createlist(sqlist &L)//创建顺序表
{
int n,x;
Initlist (L);
cout<<"请输入您要建立顺序表的数据个数"<<endl;
cin>>n;
cout<<"请输入数据"<<endl;
for(int i=0;i<n;i++)
{
cin>>x;
Listinsert(L,x);
}
}
void SearchElemPrint(sqlist &L)//顺序查找过程打印
{ int x;
cout<<"请输入您要查找的数据"<<endl;
cin>>x;
if(SearchElem(L,x)==L.length)
{ for(int i=0;i<=L.length;i++)
{
for(int j=0;j<L.length;j++)
{
cout<<L.elem[j]<<" ";
}
cout<<endl;
cout<<L.elem[L.length]<<"与"<<L.elem[i]<<"比较"<<endl;
}
cout<<"查找失败 返回L.lengh下标 该顺序表中没有该数据"<<endl;
}else{
for(int i=0;i<=SearchElem(L,x);i++)
{
for(int j=0;j<L.length;j++)
{
cout<<L.elem[j]<<" ";
}
cout<<endl;
cout<<L.elem[L.length]<<"与"<<L.elem[i]<<"比较"<<endl;
}
cout<<"查找成功 找到数据"<<x<<",下标为"<<SearchElem(L,x)<<endl;
}
}
int Search_Bin(sqlist &L)//折半查找
{
int mid,e,low=0;//从0开始
int high=L.length-1;
cout<<"请输入想要折半查找的数据"<<endl;
cin>>e;
while(low<=high)
{
mid=(low+high)/2;
if(e==L.elem[mid])
{
return mid;
}else if(e<L.elem[mid])//待查元素小于中间值,下一步在前一子表中查找
{ cout<<"待查元素小于中间值,在前一子表:";
high=mid-1;
for(int i=low;i<=high;i++)
{
cout<<" "<<L.elem[i];
}
cout<<"中查找"<<endl;
}else{ //待查元素大于中间值,下一步在后一子表中查找
low=mid+1;
cout<<"待查元素大于于中间值,在后一子表:";
for(int i=low;i<=high;i++)
{
cout<<" "<<L.elem[i];
}
cout<<"中查找"<<endl;
}
}
return -1;//查找失败 返回0
}
int main()
{
sqlist L;
createlist(L);//创建顺序表
cout<<endl<<endl;
cout<<"顺序查找过程:"<<endl;
SearchElemPrint(L);//顺序查找过程打印
cout<<endl<<endl;
cout<<"折半查找过程:"<<endl;
int n=Search_Bin(L);//折半查找
if(n!=-1)
{
cout<<"查找成功 找到数据"<<L.elem[n]<<",下标为"<<n<<endl;
}else{
cout<<"查找失败 该顺序表中没有该数据"<<endl;
}
return 0;
}
- 测试运行结果: