问答题 为了正确处理开地址散列表元素的删除,需要对每个字舆中元素增加一个删除标志位。试用双散列函数法解决碰撞,散列函数为h1(k)和h2(k),写一个从散列表中删除一个关键码k的算法。
【正确答案】(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; /*标志位状态置为"已删除"*/
   }
【答案解析】