【PTA数据结构 | C语言版】整型关键字的散列映射

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

给定一系列整型关键字和素数 p,用除留余数法定义的散列函数 H(key)=key%p 将关键字映射到长度为 p 的散列表中。用线性探测法解决冲突。

输入格式:
输入第一行首先给出两个正整数 n(≤1000)和 p(≥n 的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出 n 个整型关键字。数字间以空格分隔。

输出格式:
在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。

输入样例:
4 5
24 15 61 88

输出样例:
4 0 1 3

代码

#include <stdio.h>
#include <stdlib.h>

#define EMPTY -1  // 表示散列表中的空位置

int main() {
    int n, p;
    // 读取关键字总数和散列表长度
    scanf("%d %d", &n, &p);
    
    // 初始化散列表,全部置为空
    int *hash_table = (int *)malloc(p * sizeof(int));
    for (int i = 0; i < p; i++) {
        hash_table[i] = EMPTY;
    }
    
    // 存储每个关键字的位置
    int *positions = (int *)malloc(n * sizeof(int));
    
    // 处理每个关键字
    for (int i = 0; i < n; i++) {
        int key;
        scanf("%d", &key);
        
        // 计算初始哈希地址
        int index = key % p;
        
        // 线性探测法解决冲突
        // 注意:即使找到相同的key,也要继续探测,因为哈希表中不存储重复值
        while (hash_table[index] != EMPTY && hash_table[index] != key) {
            index = (index + 1) % p;  // 循环查找下一个空位置
        }
        
        // 记录位置并插入散列表(如果是空位置)
        positions[i] = index;
        if (hash_table[index] == EMPTY) {
            hash_table[index] = key;
        }
    }
    
    // 输出结果
    for (int i = 0; i < n; i++) {
        if (i > 0) {
            printf(" ");
        }
        printf("%d", positions[i]);
    }
    printf("\n");
    
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值