【正确答案】(1)数据结构
typedef int KeyType;
typedef int DataType;
typedef struct{
Keymype key;
DataType value;
int state;
/*删除标志位。取值为1,0,-1,分别表示存在、未使用、已删除*/
}DicElement;
typedef struct{
DicElement element[REGION_LEN];
int m:
}HashDictionary;
(2)算法
HashDictionary*createEmptyDic_hash(){ /*创建空字典*/
int i;
HashDictionary*phash=(HashDictionary*)malloc(sizeof(HashDictionary));
phash->m=REGION_LEN;
for(i=0;i<phash->m;i++)phash->element[i].state=0;
/*所有空间未使用*/
return phash;
}
int h1(KeyType key)freturn key/%REGION_LEN;)/*散列函数1*/
int h2(KeyType key){return key/%(REGION_LEN-2)+1;)
/*散列函数2*/
int quadraticSearch(HashDictionary*phash,KeyType key,int*position){
/*检索算法,用双散列函数法解决碰撞。算法结束时返回检索成功或失败标志。如果检索成功,参数*position指向找到元素的位置;否则,*position指向应插入元素的位置。若散列表溢出,则*position存放-1,返回FALSE*/
int mow,start=h1(key),incre=h2(key),state;
now=start;
*position=-1:
do{
state=phash->element[now].state;
if(state==0){ /*检索失败*/
*position=now;
return FALSE;
}
if(state==1&&phash->element[now].key==key){/*检索成功*/
*position=now;
return TRUE:
}
if (state==-1&&*position==-1)*position=now;
/*找到插入位置*/
now=(now+incre)/%phash->m;
}while(now!=start);
/*从h1(key)开始,以h2(key)为增量不断探查,直到回到起点*/
return FALSE;
/*检索失败(若此时*position等于-1,则说明散列表溢出)*/
}
void quadraticDelete(HashDictionary*phash,KeyType key){
/*删除算法,用双散列函数法解决碰撞*/
int position;
if(quadraticSearch(phash,key,&position)==FALSE){
prinft("Not exist!\n");
return;
} /*未找到该关键码*/
phash->element[position].state=-1; /*标志位状态置为"已删除"*/
}
【答案解析】