『西工大-数据结构-NOJ』 023-构造哈希表(耿8.12) 『西北工业大学』

『西工大-数据结构-NOJ』 023-构造哈希表(耿8.12) 『西北工业大学』_第1张图片
『西工大-数据结构-NOJ』 023-构造哈希表(耿8.12) 『西北工业大学』_第2张图片

解题思路:

这道题要求对给定关键字序列使用哈希映射函数,并运用线性探测再散列法构造该关键字序列的哈希表,并求出查找成功的平均查找长度。
这道题还是比较简单,没有复杂的数据结构要求和算法,只要对哈希算法比较了解,知道线性探测再散列法,这道题就比较简单了。
具体操作见代码,代码中有部分注释。

题解代码:

#include 
#include 

#define DATANUM 8
#define HASHTABLENUM 11

typedef struct HashTableNode{
    int data;
    int flag;
}HashTable;

int HashFunctionAlgorithm(int data){//哈希映射函数
    return (3*data)%11;
}

HashTable *CreateHashTableNode(int data, int flag){//新建哈希表节点
    HashTable *p;
    p = (HashTable*)malloc(sizeof(HashTable));
    p->data = data;
    p->flag = flag;
    return p;
}

void GetHashTable(HashTable *HT[], int dataList[]){//构建哈希表
    int position,flag;
    for(int i=0;i<8;i++){
        flag = 1;
        position = HashFunctionAlgorithm(dataList[i]);
        while(HT[position]!=NULL){
            position++;
            flag++;
        }
        HT[position] = CreateHashTableNode(dataList[i], flag);
    }
}

void PutOutAverageSearchLength(HashTable *HT[]){//计算ASL并输出
    int ASL=0;
    for(int i=0;i<11; i++){
        if(HT[i]!=NULL){
            ASL += HT[i]->flag;
        }
    }
    ASL = ASL/8;
    printf("%d\n",ASL);
}

int main(){
    int dataList[DATANUM] = {22,41,53,46,30,13,01,67};//数据列表储存了题中给出的未处理数据
    HashTable *HT[HASHTABLENUM] = {NULL};//由11个哈希节点构成的哈希表
    GetHashTable(HT,dataList);
    PutOutAverageSearchLength(HT);
}

你可能感兴趣的:(『西工大-数据结构-NOJ』)