数据结构与算法 7.4 五大查找之哈希查找 [线性探测法]

#include <stdio.h>
#define m 11        //定义为素数最好

int fun(int x);                     //哈希函数设置
void searchHash(int hash[m]);       //哈希查找

void initialHash(int hash[m]);      //哈希表初始化
void printHash(int hash[m]);        //哈希表输出
void insertHash(int hash[m]);       //插入
void deleteHash(int hash[m]);       //删除

int main()
{
    int hash[m];
    
    initialHash(hash);
    printHash(hash);
    
    insertHash(hash);
    printHash(hash);
    deleteHash(hash);
    printHash(hash);
    
    searchHash(hash);
    
    return 0;
}

int fun(int x) {
    int key;
    key=x%m;    //关键值为对表长取余
    return key;
}

void initialHash(int hash[m]) {
    int n,i,x,key;
    for (i=0; i<m; i++) {       //初始全部赋0值
        hash[i]=0;
    }
    printf("请输入初始化数据个数:");
    scanf("%d",&n);
    printf("依次录入%d个数据:",n);
    
    for (i=0; i<n; i++) {
        scanf("%d",&x);
        key=fun(x);
        while (hash[key]) {     //处理冲突
            
            if (key<m-1) {      //线性探测
                key++;
            } else {
                key=0;          //循环探测
            }
        }
        hash[key]=x;
    }
}

void printHash(int hash[m]) {
    int i;
    for (i=0; i<m; i++) {
        printf("%d\t",hash[i]);
    }
    printf("\n");
}

void insertHash(int hash[m]) {
    int x=1,key;
    printf("请输入增加的数(输入0时结束):");
    
    while (x) {             //x为0时退出循环
        scanf("%d",&x);
        key=fun(x);
        while (hash[key]) {
            
            if (key<m-1) {
                key++;
            } else {
                key=0;
            }
        }
        hash[key]=x;
    }
}

void deleteHash(int hash[m]) {
    int x=1,key;
    printf("请输入需要删除的数(输入0时结束):");
    
    while (x) {
        scanf("%d",&x);
        key=fun(x);
        while (hash[key]!=x) {
            
            if (key<m-1) {
                key++;
            } else {
                key=0;
            }
        }
        hash[key]=0;        //赋值为0即为删除
    }
}

void searchHash(int hash[m]) {
    int x=1,key;
    printf("请输入需要查找的数(输入-1时结束):");
    
    while (x!=-1) {
        scanf("%d",&x);
        key=fun(x);
        
        while (hash[key]!=x) {
            if (key<m-1) {
                key++;
                
                if (key==fun(x)) {                  //循环了一圈找不到
                    printf("%d->查无此数!\n",x);
                    key=-1;
                    break;
                }
            } else {
                key=0;
            }
        }
        if (key!=-1) {
            printf("%d->%d\t",x,key+1);     //输出位置时下标+1
        }
    }
    printf("\n");
}

 

猜你喜欢

转载自blog.csdn.net/qq_40711025/article/details/81460371