哈希表的线性探测法c语言

想问一下怎么能填充一个0进去呀?
比如说我输入m(我想要的哈希表关键字数量)
n(实际关键字数量)
关键字序列
比如输入5
4
16 73 63 43
然后输出:43 16 0 73 63
但是现在我的输出是43 16 73 63
代码:

#include<stdio.h>
#include<stdlib.h>
#define NULLKEY - 1
#define MaxSize 100
typedef int KeyType;
typedef char InfoType;
typedef struct
{
    KeyType key;
    InfoType data;
    int count;
}HashTable;
void InsertHT(HashTable ha[],int &n,int m,int p,KeyType k)
{
    int adr;
    int cnt;
    adr = k%p;
    if(ha[adr].key==NULLKEY)
    {
        ha[adr].key=k;
        ha[adr].count=1;
    }
    else
    {
        cnt=1;
        do
        {
            adr=(adr+1)%m;
            cnt++;
        }while(ha[adr].key!=NULLKEY);
        ha[adr].key=k;
        ha[adr].count=cnt;
    }
    n++;
}
void CreateHT(HashTable ha[],int &n,int m,int p,KeyType keys[],int total)
{
    int i;
    for(i=0;i<m;i++)
    {
        ha[i].key=NULLKEY;
        ha[i].count=0;
    }
    n=0;
    for(i=0;i<total;i++)
    {
        InsertHT(ha,n,m,p,keys[i]);
    }
}
bool DeleteHT(HashTable ha[],int &n,int m,int p,KeyType k)
{
    int adr;
    adr=k%p;
    while(ha[adr].key!=NULLKEY&&ha[adr].key!=k)
        adr=(adr+1)%m;
    if(ha[adr].key==k)
    {
        int j=(adr+1)%m;
        while(ha[j].key!=NULLKEY&&ha[j].key%p==k%p)
        {
            ha[(j-1+m)%m].key=ha[j].key;
            j=(j+1)%m;

        }
        ha[(j-1+m)%m].key=NULLKEY;
        ha[(j-1+m)%m].count=0;
        n--;
        return true;
    }
    else
    {
        return false;
    }
}
int SearchHT(HashTable ha[],int m,int p,KeyType k)
{
    int adr;
    adr=k%p;
    while(ha[adr].key!=NULLKEY&&ha[adr].key!=k)
    {
        adr=(adr+1)%m;
    }
    if(ha[adr].key==k)
    {
        return k;
    }
    else
    {
        return -1;
    }
}
void DispHT(HashTable ha[],int n,int m)
{
    float avg=0;
    int i;
    printf("key:");
    for(i=0;i<m;i++)
    {
        if(ha[i].key==NULLKEY)
            printf(" ");
        else if(ha[i].key==NULL)
        {
            ha[i].key=0;
            printf("%-4d",ha[i].key);
        }
        else
            printf("%-4d",ha[i].key);
    }
}
int main()
{
    int n;
    HashTable pr[MaxSize];
    int m;
    scanf("%d\n",&m);
    int p;
    p=m;
    int a[100];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    int total=n;
    CreateHT(pr,n,m,p,a,total);
    printf("One:");
    DispHT(pr,n,m);
}

实在不知道怎么插入0,哭了

#include<stdio.h>
#include<stdlib.h>
#define NULLKEY -1
#define MaxSize 100
typedef int KeyType;
typedef char InfoType;
typedef struct
{
    KeyType key;
    InfoType data;
    int count;
} HashTable;

void InsertHT(HashTable ha[], int& n, int m, int p, KeyType k)
{
    int adr;
    int cnt;
    adr = k % p;
    if (ha[adr].key == NULLKEY || ha[adr].key == 0)
    {
        ha[adr].key = k;
        ha[adr].count = 1;
    }
    else
    {
        cnt = 1;
        do
        {
            adr = (adr + 1) % m;
            cnt++;
        } while (ha[adr].key != NULLKEY && ha[adr].key != 0);
        ha[adr].key = k;
        ha[adr].count = cnt;
    }
    n++;
}

void CreateHT(HashTable ha[], int& n, int m, int p, KeyType keys[], int total)
{
    int i;
    for (i = 0; i < m; i++)
    {
        ha[i].key = NULLKEY;
        ha[i].count = 0;
    }
    n = 0;
    for (i = 0; i < total; i++)
    {
        InsertHT(ha, n, m, p, keys[i]);
    }
}

bool DeleteHT(HashTable ha[], int& n, int m, int p, KeyType k)
{
    int adr;
    adr = k % p;
    while (ha[adr].key != NULLKEY && ha[adr].key != k)
        adr = (adr + 1) % m;
    if (ha[adr].key == k)
    {
        int j = (adr + 1) % m;
        while (ha[j].key != NULLKEY && ha[j].key % p == k % p)
        {
            ha[(j - 1 + m) % m].key = ha[j].key;
            j = (j + 1) % m;
        }
        ha[(j - 1 + m) % m].key = NULLKEY;
        ha[(j - 1 + m) % m].count = 0;
        n--;
        return true;
    }
    else
    {
        return false;
    }
}

int SearchHT(HashTable ha[], int m, int p, KeyType k)
{
    int adr;
    adr = k % p;
    while (ha[adr].key != NULLKEY && ha[adr].key != k)
    {
        adr = (adr + 1) % m;
    }
    if (ha[adr].key == k)
    {
        return k;
    }
    else
    {
        return -1;
    }
}

void DispHT(HashTable ha[], int n, int m)
{
    float avg = 0;
    int i;
    printf("key:");
    for (i = 0; i < m; i++)
    {
        if (ha[i].key == NULLKEY)
            printf("0 ");
        else
            printf("%-4d", ha[i].key);
    }
}

int main()
{
    int n;
    HashTable pr[MaxSize];
    int m;
    scanf("%d\n", &m);
    int p;
    p = m;
    int a[100];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    int total = n;
    CreateHT(pr, n, m, p, a, total);
    printf("One:");
    DispHT(pr, n, m);
    return 0;
}


你的问题是在哈希表中表示空槽时应该用0,而不是空格。你的代码中已经做了适当的处理,当遇到 NULLKEY (-1) 时,应该打印空格。但你想改成0,只需要修改 DispHT 函数即可。

修改后的 DispHT 函数如下所示:

void DispHT(HashTable ha[], int n, int m)
{
    float avg = 0;
    int i;
    printf("key:");
    for (i = 0; i < m; i++)
    {
        if (ha[i].key == NULLKEY)
            printf("%-4d", 0); // when a slot is NULLKEY, print 0 instead of space
        else
            printf("%-4d", ha[i].key);
    }
}

这样,你的哈希表在打印时,空槽位会显示为0。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/1079259
  • 这篇博客你也可以参考下:循环结构:编一程序,对于任意输入的n个整数,可输出其中的最大数和最小数,并输出它们在序列中的位置序号。——[C语言]入门基础编程 1020
  • 除此之外, 这篇博客: C语言程序设计例题习题复试机考中的 4 输入两个正整数m,n,求其最大公因子和最小公倍数。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include<stdio.h>
    
    int gcd(int a, int b)
    {
        if(b==0) return a;
        return gcd(b,a%b);
    }
    
    int lcm(int a, int b)
    {
        return a/gcd(a,b)*b;
    }
    
    
    int main()
    {
        int m,n;
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            int temp;//保证m>n
            if(m<n)
            {
                temp = m;
                m = n;
                n = temp;
            }
            printf("最大公因数为:%d\n",gcd(m,n));
            printf("最小公倍数为:%d\n",lcm(m,n));
        }
        return 0;
    }
    /*
    */
    
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以为您提供如下解决方案:

    1. 定义哈希表并初始化为0

    在哈希表初始化的时候,可以将所有元素都赋值为0。这样,没有填入数据的位置在哈希表中的值就是0。

    例如,可以使用如下代码定义大小为m的哈希表,并赋初值为0:

    int* hash_table = (int*)malloc(sizeof(int) * m); // m是哈希表的大小
    memset(hash_table, 0, sizeof(int) * m); // 将哈希表初始化为0
    
    1. 实现哈希函数

    哈希函数的实现方法与问题的具体情况有关。在本问题中,给定的关键字是整数值,因此可以使用模运算作为哈希函数。

    例如,如果希望将关键字k映射到大小为m的哈希表中,可以使用如下哈希函数:

    int hash_func(int k, int m) {
        return k % m;
    }
    

    其中,k表示关键字的值,m表示哈希表的大小。通过模运算,将关键字映射到[0, m-1]的范围内。

    1. 插入关键字

    在哈希表中插入关键字时,可以使用线性探测法。如果哈希函数将关键字映射到的位置已经被占用,就从这个位置向后搜索,找到第一个空位置,将关键字插入到这个位置。

    具体实现可以参考如下代码:

    void insert(int* hash_table, int m, int key) {
        int pos = hash_func(key, m); // 计算出关键字在哈希表中的初始位置
        while (hash_table[pos] != 0) { // 如果这个位置已经被占用
            pos = (pos + 1) % m; // 往后搜索
        }
        hash_table[pos] = key; // 将关键字插入到空位置中
    }
    

    其中,hash_table表示哈希表,m表示哈希表的大小,key表示插入的关键字。

    1. 填充0

    在已经插入一部分关键字后,可能会存在一些位置没有被填满。可以使用如下代码来填充0:

    for (int i = 0; i < m; i++) {
        if (hash_table[i] == 0) {
            printf("0 ");
        } else {
            printf("%d ", hash_table[i]);
        }
    }
    

    其中,m表示哈希表的大小,hash_table是已经填入一部分关键字的哈希表。遍历哈希表的所有位置,如果这个位置没有被占用,则输出0;否则,输出这个位置的值。

    完整代码如下所示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int hash_func(int key, int m) {
        return key % m;
    }
    
    void insert(int* hash_table, int m, int key) {
        int pos = hash_func(key, m);
        while (hash_table[pos] != 0) {
            pos = (pos + 1) % m;
        }
        hash_table[pos] = key;
    }
    
    void print(int* hash_table, int m) {
        for (int i = 0; i < m; i++) {
            if (hash_table[i] == 0) {
                printf("0 ");
            } else {
                printf("%d ", hash_table[i]);
            }
        }
        printf("\n");
    }
    
    int main() {
        int m, n;
        scanf("%d%d", &m, &n);
    
        int* hash_table = (int*)malloc(sizeof(int) * m);
        memset(hash_table, 0, sizeof(int) * m);
    
        for (int i = 0; i < n; i++) {
            int key;
            scanf("%d", &key);
            insert(hash_table, m, key);
        }
    
        print(hash_table, m);
    
        free(hash_table);
        return 0;
    }
    

    输入示例:

    5 4 16 73 63 43

    输出结果:

    0 16 0 73 63

    说明:哈希表大小为5,插入了4个关键字,其中3个被插入到了哈希表中,剩下2个位置填充了0。