顺序表应用6:有序顺序表查询
TimeLimit: 7MS Memory Limit: 700KB
ProblemDescription
顺序表内按照由小到大的次序存放着n个互不相同的整数(1<=n<=20000),任意输入一个整数,判断该整数在顺序表中是否存在。如果在顺序表中存在该整数,输出其在表中的序号;否则输出“NoFound!"。
Input
第一行输入整数n,表示顺序表的元素个数;
第二行依次输入n个各不相同的有序整数,代表表里的元素;
第三行输入整数t,代表要查询的次数;
第四行依次输入t个整数,代表每次要查询的数值。
Output
输出t行,代表t次查询的结果,如果找到在本行输出该元素在表中的位置,否则本行输出NoFound!
ExampleInput
10
122 33 55 63 70 74 79 80 87
4
5510 2 87
ExampleOutput
4
NoFound!
NoFound!
10
Hint
Author
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<deque>
#define max 20002
using namespace std;
typedef struct node
{
int *elem;
int size;
int length;
}list;
int init(list *l)
{
l->elem=(int*)malloc(max*sizeof(int));
if(l->elem) return 0;
l->length = 0;
l->size = max;
return 1;
}
void creat(list *l,int n)
{
for(int i=1;i<=n;i++)
{scanf("%d",&l->elem[i]);}
l->length = n;
}
void changelist(list *l,int m)
{
for(int i=0;i<m;i++)
{ int tmp = l->elem[0];
for(int j =0;j<l->length-1;j++)
l->elem[j] = l->elem[j+1];
l->elem[l->length-1] = tmp;
}
}
void check(list*l,int s,int h,int m)
{
int i,t;
for(i=1;i<=m;i++)
{
t = l->elem[s];
l->elem[s++]=l->elem[h];
l->elem[h--]=t;
}
}
void print(list*c)
{
for(int i=1;i<c->length;i++)
{
printf("%d ",c->elem[i]);
}
printf("%d\n",c->elem[c->length]);
}
int order(list*l,int n)
{
int x,mid,low,high;
scanf("%d",&x);
low = 1;
high =n;
while(low<=high)
{
mid = (low+high)/2;
if(x>l->elem[mid])
low = mid+1;
else if(x<l->elem[mid])
high = mid-1;
else
return mid;
}
return -1;
}
int main()
{
list l;
int x,n ,t;
cin>>n;
init(&l);
creat(&l,n);
cin>>t;
while(t--)
{
x = order(&l,n);
if(x==-1)
cout<<"No Found!"<<endl;
else
cout<<x<<endl;
}
return 0;
}
/***************************************************
User name: jk160505徐红博
Result: Accepted
Take time: 8ms
Take Memory: 240KB
Submit time: 2017-01-14 21:08:20
****************************************************/