使用HashTable访问冲突

时间:2018-02-10 17:49:00

标签: c++ pointers hashtable access-violation nullptr

我被赋予了一个创建包含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";
        }
    }
}

此时我非常渴望得到帮助。我几乎可以肯定这是一个糟糕的指针,但我从来都不理解它们。所有帮助将不胜感激! (这也是我的第一篇文章,所以希望我没有做错任何事情)

1 个答案:

答案 0 :(得分:0)

也许我误解了这一点,但工会看起来很可疑

union bucket
{
    int count;
    bucket* nextOverflow;

    struct slot {
        string keyValue;
        string dataValue;
    };

    slot* slots[2];

} HashTable[30];

union应该只包含其成员的一个,在这种情况下是其中一个

  • 计数
  • nextOverflow
  • 时隙[2]

也许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;