0

我一直在研究这个哈希表实现,但遇到了障碍。我修改了构造函数和插入函数,以便在达到容量时能够调整数组的大小,但是我在调​​整大小时遇到​​了问题。现在,它似乎在无限插入负数据,我不知道为什么。我应该在调整大小中实现迭代器还是有更简单的方法?

以下是功能:

调整大小:

template <class RecordType>
void table<RecordType>::resize( )
{

    RecordType *oldData = data;
    int oldSize = CAPACITY;
    int newSize = CAPACITY *2;

    //create a new table
    RecordType *newData;
    newData = new RecordType[CAPACITY];

    size_t i;
    used = 0;

    for (i = 0; i < CAPACITY; i++)
        newData[i].key = NEVER_USED;

    data = newData;
    delete[] newData;

    //place data from old table to new, larger table.
    for(int i = 0; i < oldSize; i++)
    {
            RecordType next = oldData[i];
            insert(next);
    }

    CAPACITY = newSize;
    delete[] oldData;
}

构造函数:

template <class RecordType>
table<RecordType>::table( )
{
    CAPACITY = 30;
    data = new RecordType[CAPACITY];

    size_t i;

    used = 0;
    for (i = 0; i < CAPACITY; ++i)
        data[i].key = NEVER_USED;

}

插入:

template <class RecordType>
void table<RecordType>::insert(const RecordType& entry)
// Library facilities used: cassert
{
    bool already_present;   // True if entry.key is already in the table
    size_t index;        // data[index] is location for the new entry

    assert(entry.key >= 0);

    // Set index so that data[index] is the spot to place the new entry.
    find_index(entry.key, already_present, index);

    // If the key wasn't already there, then find the location for the new entry.
    if (!already_present)
    {
        if (size( ) >= CAPACITY)
        {
            resize( ); // resize the table.

            insert(entry); // reinsert entry into new table.
        }
        else if (size( ) < CAPACITY)
        {
            index = hash(entry.key);

            while (!is_vacant(index))
                index = next_index(index);
            ++used;
        }
    }

    data[index] = entry;
    size_t i;
    for (i=0; i<CAPACITY; i++) cout << data[i].key << ' ';
    cout << endl;
}

谢谢您的帮助!

4

1 回答 1

0

resize()正在调用insert()将数据放入data[]. 然后用空(满)数组resize()覆盖。我的猜测是您想摆脱并改用它。dataNEVER_USEDnewDatanewDatadata

您可能也应该重新考虑CAPACITY *= CAPACITY,因为当您尝试将此代码用于真实的事情时,这会爆炸。

于 2013-06-08T04:09:18.830 回答