目录
查找的概念
查找(或检索)是在给定信息集上寻找特定信息元素的过程。
顺序表查找
int a=10,b=9,i;
for(i=0;i<a;i++){
if(i==b)
printf("find it\n");
}
折半查找![](https://i-blog.csdnimg.cn/direct/b34eeefc5df949668aa04da746e2f9c0.png)
nt binserch(int *s,int key);
int main(){
int a[N]={-33,-12,18,20,32,55,60,68,80,86,90,100};
int *s,key,p;
s = a;
printf("put key\n");
scanf("%d",&key);
p = binserch(s,key);
printf("%d\n",p);
return 0;
}
int binserch(int *s,int key){
int mid,low,high;
low = 0;
high = N-1;
while(low<=high){
mid = (low +high)/2;
printf("%d,%d,%d\n",mid,low,high);
if(s[mid] == key){
return mid;
} //如果中间数mid比要查的数据大,把mid-1赋值给high,然后重新去查询mid
else if(s[mid]>key ){
high = mid-1;
} //如果中间数mid比要查的数据小,把mid+1赋值给low,然后重新去查询mid
else if(s[mid]<key ){
low = mid+1;
}
}
return -1;
}
hash表链地址法
链地址法解决冲突的优点:无聚积现象;删除表中记录容易实现。而开放地址法的Hash表作删除时,不能将记录所在单元置空,只能作删除标记。
设H(key)=key%13,其值域为[0,12], 建立指针向量 HP[l2]。k={ 23,34,14,38,46,16,68,15,07,31,26 } 依次取其中各值,用链地址法 解决冲突时的Hash表如下一页中的动态图
hash表结构
#ifndef _HASH_
#define _HASH_
#define N 15
typedef int datatype;
typedef struct node{
datatype key;//存查的值取余
datatype value;
struct node *next;
}listnode,*linklist;
typedef struct{
listnode data[N];
}hash;
hash *hash_create();
int hash_insert(hash *HT,datatype key);
linklist hash_search(hash *HT,datatype key);
#endif
hash表创建
hash *hash_create(){
hash *HT;
if((HT=(hash *)malloc(sizeof(hash))) == NULL){
printf("malloc error\n");
return NULL;
}
memset(HT,0,sizeof(hash));
return HT;
}
插入数据
int hash_insert(hash *HT,datatype key){
if(HT == NULL){
printf("HT is NULL\n");
return -1;
}
linklist p,q;
if((p = (linklist)malloc(sizeof(listnode))) == NULL){
printf("listnode malloc error\n");
return -1;
}
p->key = key;//key存的是查找数据
p->value = key % N;//value存的取余后的值
p->next = NULL;
q = &(HT->data[key%N]);//头结点存第一个节点地址,按照取余数存在数据里面
while(q->next&&q->next->key<p->key){
q = q->next;
}
p->next = q->next;
q->next = p;
return 0;
}
查找表数据
linklist hash_search(hash *HT,datatype key){
linklist p;
if(HT == NULL){
printf("HT is NULL\n");
return NULL;
}
p = &(HT->data[key % N]);
while(p->next && p->next->key!=key){
p = p->next;
}
if(p->next == NULL){
return NULL;
}
else{
printf("found\n");
return p->next;
}
}