一、实现折半查找
int BSL_FindKey(BSeqList* blist, int key)
//在排序的顺序表中查找关键码值为key的结点,返回结点的编号
//返回值大于等于0时表示找到值为key的结点的编号,-1表示没有找到
{
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
int l=0,r = blist->len-1,mid = (l+r)/2;
while(l<=r)
{
if(blist->pkey[mid]==key) return mid;
else if(blist->pkey[mid]<key)
{
l = mid+1;
mid = (l+r)/2;
}
else
{
r = mid-1;
mid = (l+r)/2;
}
}
return -1;
/******END******/
/*请不要修改[BEGIN,END]区域外的代码*/
}
二、实现散列查找
bool ILH_InsKey(LHTable* pt, int x)
//插入关键码x
//返回true,表示插入成功
//返回false,表示插入失败(关键码已经存在)
{
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
if(ILH_FindKey(pt,x))
{
return false;
}
int n=pt->n;
int k=x%n;
HNode* p=&(pt->pn[k]);
if(pt->pn[k].key==0)
{
pt->pn[k].key=x;
return true;
}
while (p->next && p->key!=x)
{
p=p->next;
}
HNode* pnode=(HNode*)malloc(sizeof(HNode));
pnode->key=x;
pnode->next=NULL;
p->next=pnode;
return true;
/******END******/
/*请不要修改[BEGIN,END]区域外的代码*/
}
bool ILH_DelKey(LHTable* pt, int x)
//删除关键码
//返回true表示该关键码存在,且成功删除
//返回false表示该关键码不存在
{
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
if(!ILH_FindKey(pt,x))
{
return false;
}
int n=pt->n;
int k=x%n;
HNode* p=pt->pn[k].next;
HNode* q=&(pt->pn[k]);
while(p->next)
{
if(p->key==x)
{
break;
}
p=p->next;
q=p->next;
}
q->next=p->next;
return true;
/******END******/
/*请不要修改[BEGIN,END]区域外的代码*/
}