想问一下怎么能填充一个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。
#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;
}
/*
*/
我可以为您提供如下解决方案:
在哈希表初始化的时候,可以将所有元素都赋值为0。这样,没有填入数据的位置在哈希表中的值就是0。
例如,可以使用如下代码定义大小为m的哈希表,并赋初值为0:
int* hash_table = (int*)malloc(sizeof(int) * m); // m是哈希表的大小
memset(hash_table, 0, sizeof(int) * m); // 将哈希表初始化为0
哈希函数的实现方法与问题的具体情况有关。在本问题中,给定的关键字是整数值,因此可以使用模运算作为哈希函数。
例如,如果希望将关键字k映射到大小为m的哈希表中,可以使用如下哈希函数:
int hash_func(int k, int m) {
return k % m;
}
其中,k表示关键字的值,m表示哈希表的大小。通过模运算,将关键字映射到[0, m-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表示插入的关键字。
在已经插入一部分关键字后,可能会存在一些位置没有被填满。可以使用如下代码来填充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。