我被赋予了一个创建包含30个桶(20个主要,10个溢出)的哈希表的赋值,每个桶包含3个槽(每个槽包含2个用于传入密钥和数据的stings),一个计数器整数和指向下一个溢出存储桶的指针变量。我上一个C ++课程已经超过一年了,所以我完全迷失了我应该如何正确创建这个表格(没有我教授的帮助)。
这是我在下面的课堂声明。它在技术上编译,但它立即崩溃,当它调试时,我得到一个“访问冲突读取位置”错误,在我的家用电脑上说“这是nullptr”(它包括我在课堂上使用的计算机上的特定内存位置)
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
// Define Global Variables
#define MAXBUCKETs 30
#define MAXSLOTs 3
typedef char STR10[10 + 1];
typedef char STR20[20 + 1];
// Define Class
class hash{
public:
int primaryBuckets = 20;
int overflowBuckets = 10;
union bucket
{
int count;
bucket* nextOverflow;
struct slot {
string keyValue;
string dataValue;
};
slot* slots[2];
} HashTable[30];
hash(); // Initialize HashTable
int HashFunction(STR10 key, int buckets); // Hash key to index
void InsertIntoHT(STR10 key, STR20 data); // Add data to slot
void PrintItemsInIndex();
void InsertOverflow(STR10 key, STR20 data, int index);
void InsertPrimary(STR10 key, STR20 data, int index);
};
根据我的理解,我的构造函数以正确的顺序初始化数组
::hash::hash()
{
for (int i = 0; i < MAXBUCKETs; i++)
{
HashTable[i].count = 0;
for (int j = 0; j < MAXSLOTs; j++)
{
HashTable[i].slots[j]->keyValue = "no_data";
HashTable[i].slots[j]->dataValue = "no_data";
}
}
}
此时我非常渴望得到帮助。我几乎可以肯定这是一个糟糕的指针,但我从来都不理解它们。所有帮助将不胜感激! (这也是我的第一篇文章,所以希望我没有做错任何事情)
答案 0 :(得分:0)
也许我误解了这一点,但工会看起来很可疑
union bucket
{
int count;
bucket* nextOverflow;
struct slot {
string keyValue;
string dataValue;
};
slot* slots[2];
} HashTable[30];
union应该只包含其成员的一个,在这种情况下是其中一个
也许struct bucket
更合适。
具体来说,
HashTable[i].count = 0;
将count
成员设置为零,同时覆盖slots
的内存,该内存包含指向slot
条目的指针
HashTable[i].slots[j]->keyValue = "no_data";
在这里,您必须使用我推荐的普通slot
对象,例如
slot slots[MAXSLOTs];
或首先用新的
初始化for (int i = 0; i < MAXSLOTs; ++i)
slots[i] = new slot;