我一直在研究这个哈希表实现,但遇到了障碍。我修改了构造函数和插入函数,以便在达到容量时能够调整数组的大小,但是我在调整大小时遇到了问题。现在,它似乎在无限插入负数据,我不知道为什么。我应该在调整大小中实现迭代器还是有更简单的方法?
以下是功能:
调整大小:
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;
}
谢谢您的帮助!