1.哈希查找
#include<stdio.h>
#include<stdlib.h>
#define ok 1
#define error 0
typedef int status;
typedef int keytype;
typedef struct{
keytype key;
}elemtype;
typedef struct{
elemtype *elem;
int count;
}hashtable;
int hash(keytype k,int m)
{
return k%m;
}
int collision(int p,int length,int d)
{
return (p+d)%length;
}
status createhashtable(hashtable &h,int n,int m)
{
int i,p,hashp,d;
keytype key;
h.count=n;
h.elem=(elemtype *)malloc((h.count)*sizeof(elemtype));
if(!h.elem) return error;
for(i=0;i<=h.count-1;i++)
h.elem[i].key=0;
scanf("%d",&key);
while(key!=-1)
{
hashp=hash(key,m);
p=hashp;
d=1;
while(h.elem[p].key!=0)
{
p=collision(hashp,h.count,d);
d++;
}
h.elem[p].key=key;
scanf("%d",&key);
}
return ok;
}
status destroyhashtable(hashtable &h)
{
free(h.elem);
return ok;
}
int hashsearch (hashtable h,int &m,keytype key)
{
int d=1;
int p=hash(key,m);
while(h.elem[p].key!=0&&h.elem[p].key!=key)
{
p=collision(p,h.count,d);
}
if(h.elem[p].key==key)
return p;
else
return -1;
}
int main()
{
hashtable h;
keytype key;
int order,n,m;
scanf("%d%d",&n,&m);// ϣ ȼ ϣ ȡģֵ
createhashtable(h,n,m);
//printf("please input key : );
scanf("%d",&key);
order=hashsearch (h,m,key);
printf("order is:%d ",order);
destroyhashtable(h);
return 0;
}
2.顺序查找
#include<bits/stdc++.h>
using namespace std;
typedef int status;
#define error 0
#define ok 1
#define overflow -1
typedef int keytype;
typedef struct{
keytype key;
}elemtype;
typedef struct{
elemtype *elem;
int length;
}sstable;
status createsstable(sstable &st)
{
int i,n;
cin>>n;
st.length=n;
st.elem=(elemtype *)malloc((st.length+1)*sizeof(elemtype));
if(!st.elem) return error;
for(i=1;i<=st.length;i++)
cin>>st.elem[i].key;
return ok;
}
status destroysstable(sstable &st)
{
free(st.elem);
return ok;
}
int ssearch(sstable st,keytype key)
{
int i;
st.elem[0].key=key;
for(i=st.length;st.elem[i].key!=key;i--);
return i;
}
int main()
{
sstable st;
keytype key;
int order;
createsstable(st);
cin>>key;
order=ssearch(st,key);
cout<<order;
destroysstable(st);
return 0;
}
3.折半查找
#include<bits/stdc++.h>
using namespace std;
typedef int status;
#define error 0
#define ok 1
#define overflow -1
typedef int keytype;
typedef struct{
keytype key;
}elemtype;
typedef struct{
elemtype *elem;
int length;
}sstable;
status createsstable(sstable &st)
{
int i,n;
cin>>n;
st.length=n;
st.elem=(elemtype *)malloc((st.length+1)*sizeof(elemtype));
if(!st.elem) return error;
for(i=1;i<=st.length;i++)
cin>>st.elem[i].key;
return ok;
}
status destroysstable(sstable &st)
{
free(st.elem);
return ok;
}
status sort(sstable &st)
{
int i,j;
for(i=2;i<=st.length;i++)
if(st.elem[i].key<st.elem[i-1].key)
{
st.elem[0]=st.elem[i];
st.elem[i]=st.elem[i-1];
for(j=i-2;st.elem[0].key<st.elem[j].key;j--)
st.elem[j+1]=st.elem[j];
st.elem[j+1]=st.elem[0];
}
return ok;
}
int bsearch(sstable st,keytype key)
{
int low,high,mid;
low=1;
high=st.length;
while(low<=high)
{
mid=(low+high)/2;
if(key==st.elem[mid].key) return mid;
else if(key<st.elem[mid].key) high=mid-1;
else low=mid+1;
}
return 0;
}
int main()
{
sstable st;
keytype key;
int order;
createsstable(st);
sort(st);
cin>>key;
order=bsearch(st,key);
cout<<order;
destroysstable(st);
return 0;
}