I've been working on this hash table implementation and I've hit a roadblock. I modified the constructor and insert functions to be able to resize the array if capacity is reached, but I'm having problems with the resize. Right now, it seems to be infinitely inserting negative data and I'm not sure why. Should I implement an iterator within the resize or is there a simpler way of doing it?
Here are the functions:
resize:
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;
}
constructor:
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;
}
insert:
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;
}
Thanks for the help!